在Python中,使用正则表达式解析特定格式数据并提取关键信息可通过re模块实现,核心步骤如下:
1. 明确目标与数据格式假设需从以下字符串中提取55=id和1007=symbol的键值对,并以symbol = id格式输出:
55=22395|1007=BTCUSD|1008=3|55=22396|1007=BTCEUR|1008=2|...- 关键模式:55=数字和任意数字=非竖线字符(如1007=BTCUSD)。
- 挑战:字符串非结构化,手动分割易出错,需高效提取。
2. 构建正则表达式使用正则表达式r"b55=(d+)|d+=([^|]+)"匹配目标数据:
- r"":原始字符串,避免反斜杠转义。
- b55=:匹配单词边界后的55=,确保独立性(如排除155)。
- (d+):捕获组1,匹配55=后的数字(id)。
- |d+=:匹配|后跟任意数字和=(如|1007=)。
- ([^|]+):捕获组2,匹配=后非竖线的字符(symbol)。
3. Python实现步骤步骤1:导入re模块import re步骤2:定义原始字符串与正则模式s = """55=22395|1007=BTCUSD|1008=3|55=22396|1007=BTCEUR|1008=2|..."""pattern = r"b55=(d+)|d+=([^|]+)"步骤3:使用re.findall()提取数据- 功能:返回所有非重叠匹配项,每个匹配项为元组(捕获组内容)。
extracted_data = re.findall(pattern, s)# 输出示例:[('22395', 'BTCUSD'), ('22396', 'BTCEUR'), ...]步骤4:格式化输出for id_, symbol in extracted_data: print(f"{symbol:<30} {id_}")symbol_to_id_map = {symbol: id_ for id_, symbol in extracted_data}for symbol, id_ in symbol_to_id_map.items(): print(f"'{symbol}': '{id_}'")4. 完整代码示例import res = """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|"""pattern = r"b55=(d+)|d+=([^|]+)"extracted_data = re.findall(pattern, s)print("提取到的数据:")print("-" * 40)for id_, symbol in extracted_data: 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_}'")5. 输出结果示例提取到的数据:----------------------------------------BTCUSD 22395BTCEUR 22396ETHUSD 22397ETHEUR 22398TELENET GROUP 20009MAGNEGAS CORP 20011...转换为字典格式:----------------------------------------'BTCUSD': '22395''BTCEUR': '22396''ETHUSD': '22397'...6. 注意事项- 正则表达式精确性:根据实际数据调整模式(如固定1007=可提高准确性)。
- 原始字符串:使用r""避免转义问题。
- 错误处理:检查re.findall()返回是否为空,处理异常数据。
- 数据结构选择:字典适合快速查找,列表适合顺序处理。
- 性能优化:对极长字符串或高频操作,可考虑优化正则或使用其他方法。
通过以上步骤,可高效解析非结构化字符串并提取关键信息,适用于日志、API响应等场景。