
在日常开发中,我们经常会遇到从非标准格式的字符串中提取特定信息的场景。这些字符串可能来自日志文件、api响应或终端输出,其结构往往介于完全非结构化和严格结构化之间。例如,以下字符串包含了一系列用竖线分隔的键值对,其中我们关注的是55=id和1007=symbol这两个模式,并希望将它们以symbol = id的形式提取出来:
55=22395|1007=BTCUSD|1008=3|55=22396|1007=BTCEUR|1008=2|...
面对这类数据,手动分割和查找效率低下且易出错。此时,正则表达式(Regular Expression, Regex)作为一种强大的模式匹配工具,能够提供优雅而高效的解决方案。
正则表达式是一种描述字符串模式的语言。通过定义特定的模式,我们可以在文本中搜索、匹配和提取符合这些模式的子字符串。在Python中,re模块提供了完整的正则表达式支持。
本教程的目标是从类似55=ID|1007=SYMBOL的片段中,提取出ID和SYMBOL。
为了准确捕捉我们所需的信息,我们需要构建一个能够识别55=数字|任意数字=非竖线字符这一模式的正则表达式。
立即学习“Python免费学习笔记(深入)”;
我们将使用的正则表达式是:r"\b55=(\d+)\|\d+=([^|]+)"。
下面对这个模式进行详细解析:
通过这个正则表达式,我们可以确保每次匹配都能得到一个ID和一个SYMBOL。
有了正则表达式模式,我们就可以使用Python的re模块来执行匹配和提取操作。re.findall()函数非常适合这种场景,它会在字符串中找到所有非重叠的匹配项,并以列表的形式返回所有捕获组。
import re
# 待解析的原始字符串数据
s = """55=22395|1007=BTCUSD|1008=3|55=22396|1007=BTCEUR|1008=2|55=22397|1007=ETHUSD|1008=3|55=22398|1007=ETHEUR|1008=3|55=20009|1007=TELENET GROUP|1008=2|55=20011|1007=MAGNEGAS CORP|1008=2|55=20012|1007=CALUMET SPEC PRDCTS|1008=2|55=20013|1007=CBOE HLDG INC|1008=2|55=20014|1007=ELECTRONIC ARTS INC|1008=2|55=20015|1007=EXPRESS SCRIPTS INC|1008=2|55=20016|1007=ADVANCE AUTO PARTS|1008=2|55=20017|1007=CHINA FUND INC|"""
# 定义正则表达式模式
# 捕获组1: ID (55=后面的数字)
# 捕获组2: Symbol (任意数字=后面的非竖线字符)
pattern = r"\b55=(\d+)\|\d+=([^|]+)"
# 使用re.findall()查找所有匹配项
# re.findall会返回一个列表,其中每个元素是一个元组,包含所有捕获组的内容
extracted_data = re.findall(pattern, s)
# 遍历提取到的数据并按指定格式输出
print("提取到的数据:")
print("-" * 40)
for id_, symbol in extracted_data:
# 使用f-string进行格式化输出,:<30 表示左对齐,宽度为30
print(f"{symbol:<30} {id_}")
# 如果需要将数据存储为字典,便于后续查找
symbol_to_id_map = {symbol: id_ for id_, symbol in extracted_data}
print("\n转换为字典格式:")
print("-" * 40)
for symbol, id_ in symbol_to_id_map.items():
print(f"'{symbol}': '{id_}'")代码执行结果:
提取到的数据: ---------------------------------------- BTCUSD 22395 BTCEUR 22396 ETHUSD 22397 ETHEUR 22398 TELENET GROUP 20009 MAGNEGAS CORP 20011 CALUMET SPEC PRDCTS 20012 CBOE HLDG INC 20013 ELECTRONIC ARTS INC 20014 EXPRESS SCRIPTS INC 20015 ADVANCE AUTO PARTS 20016 CHINA FUND INC 20017 转换为字典格式: ---------------------------------------- 'BTCUSD': '22395' 'BTCEUR': '22396' 'ETHUSD': '22397' 'ETHEUR': '22398' 'TELENET GROUP': '20009' 'MAGNEGAS CORP': '20011' 'CALUMET SPEC PRDCTS': '20012' 'CBOE HLDG INC': '20013' 'ELECTRONIC ARTS INC': '20014' 'EXPRESS SCRIPTS INC': '20015' 'ADVANCE AUTO PARTS': '20016' 'CHINA FUND INC': '20017'
通过本教程,我们学习了如何利用Python的re模块和正则表达式,从复杂的、非标准格式的字符串中高效地提取特定信息。掌握正则表达式是处理文本数据的必备技能之一,它能显著提高数据清洗、解析和转换的效率。在面对类似数据提取需求时,合理构建正则表达式将是解决问题的关键。
以上就是Python中使用正则表达式解析特定格式数据并提取关键信息的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号