如何在Python中从结构化字符串中提取所需数据?
阅读更多:Python 教程
介绍…
我将展示几种方法来从结构化的字符串中提取所需数据/字段。当输入结构的格式为已知格式时,这些方法将很有帮助。
如何实现…
1.让我们创建一个虚拟格式以了解该方法。
Report: <> - Time: <> - Player: <> - Titles: - Country: <>
报告:Daily_Report-Time:2020-10-16T01:01:01.000001-Player:Federer-标题:20-国家:瑞士
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'
2.我从报告中注意到的第一件事是分隔符“-”。我们将继续使用“-”解析报告。
fields = report.split(' - ')
name,time,player,titles,_ = fields
print(f“Output \n *** 报告名称{name}生成于{time},共有{titles}个{player}标题。 ”)
输出
*** 报告名称Report: Daily_Report生成于Time: 2020-10-10T12:30:59.000000,有Titles:20个“Federer”标题。
3.现在,输出不符合预期,因为我们仍然可以看到一些不需要的标签,例如Report:,Time:,Player:。
#仅提取报告名称
formatted_name = name.split(':')[1]
#仅提取玩家
formatted_player = player.split(':')[1]
#仅提取标题
formatted_titles = int(titles.split(':')[1])
#仅提取标题
new_time = time.split(': ')[1]
print(f“Output \n {formatted_name},{new_time},{formatted_player},{formatted_titles}”)
输出
Daily_Report,2020-10-10T12:30:59.000000,“Federer”,20
4.现在,时间戳格式为ISO格式,如果您想要拆分,则可以将其拆分,或者将其保留为所示。让我向您展示如何拆分时间戳字段。
from datetime import datetime
formatted_date = datetime.fromisoformat(new_time)
print(f“Output \n {formatted_date}”)
输出
2020-10-10 12:30:59
- 现在,我们将所有这些步骤组合成一个单个函数。
def parse_function(log):
"""
功能:以以下格式解析给定的日志
报告:<> - 时间:<> - 球员:<> - 标题:-国家:<>
参数:日志
返回:所需数据
"""
fields = log.split(' - ')
name,time,player,titles,_ = fields
#仅提取报告名称
formatted_name = name.split(':')[1]
#仅提取玩家
formatted_player = player.split(':')[1]
#仅提取标题
formatted_titles = int(titles.split(':')[1])
#仅提取标题
new_time = time.split(': ')[1]
return f“{formatted_name},{new_time},{formatted_player},{formatted_titles}”
if __name__ == '__main__':
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000- Player: Federer - Titles: 20 - Country: Switzerland'
data = parse_function(report)
print(f"Output \n{data}")
输出
Daily_Report,2020-10-10T12:30:59.000000,“Federer”,20
6.我们可以使用parse模块使其变得更简单。如您所见,格式创建模板。我们可以使用parse模块来更轻松地完成这项工作。
首先通过- pip install parse – 安装parse模块
from parse import parse
report = 'Report: Daily_Report - Time: 2020-10-10T12:30:59.000000 - Player: Federer - Titles: 20 - Country: Switzerland'
#查看报告,创建一个模板
template = 'Report: {name} - Time: {time} - Player: {player} - Titles: {titles} - Country: {country}'
#运行解析并检查结果
data = parse(template,report)
print(f“Output \n {data}”)
输出
<Result () {'name': 'Daily_Report', 'time': '2020-10-10T12:30:59.000000', 'player': 'Federer', 'titles': '20', 'country': 'Switzerland'}>
7. 通过定义模板,我们可以使用简单的一行代码从日志中提取数据,并提取个别值。
print(f"输出 \n {data['name']} - {data['time']} - {data['player']} - {data['titles']} - {data['country']}")
输出
Daily_Report - 2020-10-10T12:30:59.000000 - Federer - 20 - Switzerland
结论:
您已经看到了从日志文件中获取所需数据的一些方法。推荐定义模板并使用解析模块来提取所需数据。