如何在 Python 中从结构化字符串中提取所需数据?

pythonserver side programmingprogramming更新于 2026/2/15 19:56:17

简介...

我将向您展示几种从结构化字符串中提取所需数据/字段的方法。这些方法将有所帮助,其中输入结构的格式是已知的格式。

如何做到这一点..

1. 让我们创建一个虚拟格式来理解该方法。

Report: <> - Time: <> - Player: <> - Titles: - Country: <>

Report: Daily_Report - Time: 2020-10-16T01:01:01.000001 - Player: Federer - Titles: 20 - Country: Switzerland

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:。

# 仅提取报告名称
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):
"""
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

# 仅提取报告名称
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. 我们可以使用解析模块使其变得简单一些。如您所见,格式创建一个模板。我们可以使用解析模块更轻松地完成此操作。

首先通过 - pip install 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"Output \n {data['name']} - {data['time']} - {data['player']} - {data['titles']} - {data['country']}")

输出

Daily_Report - 2020-10-10T12:30:59.000000 - Federer - 20 - Switzerland

结论:

您已经了解了几种从日志文件解析所需数据的方法。最好定义模板并使用解析模块来提取所需数据。


相关文章


有用资源