正则表达式匹配失败,求助提取日志表格数据的正确正则
日志数据提取正则表达式解决方案
问题分析
你之前的正则表达式逻辑混乱,导致匹配失败,核心问题包括:
- 匹配顺序错误:
Period在数据行开头,却被放在正则末尾,无法命中目标行 - 冗余写法:
[\s+\S+]等价于任意字符,会错误匹配无关内容 - 分组范围错误:
(?<time>...)包含过多无关数据,无法正确捕获目标字段
正确正则表达式
单行匹配(针对单条数据)
匹配Period或Global行的正则:
^(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\.\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)$
批量匹配(跳过表头)
使用多行模式,自动跳过第一行表头:
^(?!Type)(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\.\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)$
(?!Type)是负向前瞻,确保不匹配表头行- 需开启多行模式(如Python中的
re.MULTILINE),让^匹配每行开头
捕获组对应字段
每个捕获组严格对应表头的字段:
- 组1:Type(Period/Global)
- 组2:Time(s)
- 组3:Ops
- 组4:TPS(ops/s)
- 组5:Net(M/s)
- 组6:Get_miss
- 组7:Min(us)
- 组8:Max(us)
- 组9:Avg(us)
- 组10:Std_dev
- 组11:Geo_dist
代码示例(Python)
用正则提取数据并生成结构化字典,方便转为表格:
import re log_content = """Type Time(s) Ops TPS(ops/s) Net(M/s) Get_miss Min(us) Max(us) Avg(us) Std_dev Geo_dist Period 5 145443 29088 22.4 37006 352 116302 6600 7692.04 4003.72 Global 10 281537 28153 23.2 41800 281 120023 6797 7564.64 4212.93""" # 编译正则,开启多行模式 pattern = re.compile(r'^(?!Type)(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\.\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+\.\d+)\s+(\d+\.\d+)$', re.MULTILINE) matches = pattern.finditer(log_content) # 表头列表 headers = ["Type", "Time(s)", "Ops", "TPS(ops/s)", "Net(M/s)", "Get_miss", "Min(us)", "Max(us)", "Avg(us)", "Std_dev", "Geo_dist"] # 提取并打印结构化数据 for match in matches: row_data = dict(zip(headers, match.groups())) print(row_data)
运行后输出:
{'Type': 'Period', 'Time(s)': '5', 'Ops': '145443', 'TPS(ops/s)': '29088', 'Net(M/s)': '22.4', 'Get_miss': '37006', 'Min(us)': '352', 'Max(us)': '116302', 'Avg(us)': '6600', 'Std_dev': '7692.04', 'Geo_dist': '4003.72'} {'Type': 'Global', 'Time(s)': '10', 'Ops': '281537', 'TPS(ops/s)': '28153', 'Net(M/s)': '23.2', 'Get_miss': '41800', 'Min(us)': '281', 'Max(us)': '120023', 'Avg(us)': '6797', 'Std_dev': '7564.64', 'Geo_dist': '4212.93'}
内容的提问来源于stack exchange,提问作者Ankur Munjaal
相关产品推荐
相关产品推荐

