Python正则表达式按值拆分问题:匹配键值对返回空列表求助
解决方案
你的原始正则存在两个核心问题:一是仅覆盖了日志开头的普通键值对,未适配后面的JSON结构;二是开头的(?:\w+ :)匹配限制过死,容错性差。
以下提供两种实现方式,按需选择:
方式一:双正则组合(纯正则处理)
用两个正则分别提取日志里的普通键值对和JSON内的键值对,再合并结果:
import re data = 'JUN 2023 02 20 INFO : data1 = data2 data3 = data4 {"app":[{"key":"app1","value":"100"},{"key":"app2","value":"200"},{"key":"app3","value":"300"}]}' # 提取日志中的data1、data3键值对 normal_pairs = re.findall(r'(\w+)\s*=\s*(\w+)(?=\s+\w+\s*=|\s*{)', data) # 提取JSON中的app1~app3键值对 json_pairs = re.findall(r'"key":"(\w+)","value":"(\w+)"', data) # 合并并按预期格式输出 all_pairs = normal_pairs + json_pairs print("[") for key, val in all_pairs: print(f" '{key}' = '{val}',") print("]")
运行输出:
[ 'data1' = 'data2', 'data3' = 'data4', 'app1' = '100', 'app2' = '200', 'app3' = '300', ]
方式二:正则+JSON解析(更稳定)
JSON结构用正则处理容易出问题,推荐用json模块解析JSON部分,更可靠:
import re import json data = 'JUN 2023 02 20 INFO : data1 = data2 data3 = data4 {"app":[{"key":"app1","value":"100"},{"key":"app2","value":"200"},{"key":"app3","value":"300"}]}' # 提取普通键值对 normal_pairs = re.findall(r'(\w+)\s*=\s*(\w+)(?=\s+\w+\s*=|\s*{)', data) # 提取并解析JSON字符串 json_str = re.search(r'{.*}', data).group() json_data = json.loads(json_str) json_pairs = [(item['key'], item['value']) for item in json_data['app']] # 合并输出 all_pairs = normal_pairs + json_pairs print("[") for key, val in all_pairs: print(f" '{key}' = '{val}',") print("]")
内容的提问来源于stack exchange,提问作者Learn Hadoop
相关产品推荐
相关产品推荐

