如何在 Python 中从结构化字符串中提取所需数据?
介绍...
我将向您展示几种从结构化字符串中提取所需数据/字段的方法。这些方法将有助于在输入结构的格式为已知格式的情况下。
操作方法..
1. 让我们创建一个虚拟格式来理解这种方法。
Report: <> - Time: <> - Player: <> - Titles: - Country: <>
报告:Daily_Report - 时间:2020-10-16T01:01:01.000001 - 玩家:费德勒 - 冠军: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 *** The report name {name} generated on {time} has {titles} titles for {player}. ")
输出
*** The report name Report: Daily_Report generated on Time: 2020-10-10T12:30:59.000000 has Titles: 20 titles for Player: Federer.
3. 现在输出并不像预期的那样,因为我们仍然可以看到一些不需要的标签,如 Report:、Time:、Player:。
# extract only report name formatted_name = name.split(':')[1] # extract only player formatted_player = player.split(':')[1] # extract only titles formatted_titles = int(titles.split(':')[1]) # extract only titles 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): """ Function : Parse the given log in the format Report: <> - Time: <> - Player: <> - Titles: - Country: <> Args : log Return : required data """ fields = log.split(' - ') name, time, player , titles, _ = fields # extract only report name formatted_name = name.split(':')[1] # extract only player formatted_player = player.split(':')[1] # extract only titles formatted_titles = int(titles.split(':')[1]) # extract only titles 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' # Looking at the report, create a template template = 'Report: {name} - Time: {time} - Player: {player} - Titles: {titles} - Country: {country}' # Run parse and check the results 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"Output \n {data['name']} - {data['time']} - {data['player']} - {data['titles']} - {data['country']}")
输出
Daily_Report - 2020-10-10T12:30:59.000000 - Federer - 20 - Switzerland
结论
您已经看到了几种从日志文件中解析所需数据的方法。建议定义模板并使用 parse 模块提取所需数据。
广告