Python正则解析日志文件:解决多键值提取与类型转换问题
解决方案
问题分析
- 一行多键值对提取不全:原代码大概率使用了单次匹配方法(如
re.search),仅能捕获第一个匹配项;需改用全局匹配方法(re.findall)来抓取行内所有键值对。 - 数值为字符串类型:提取后对捕获的数值字段显式调用
float()转换即可解决。
日志示例
bias voltage: 12.5V, filament current: 0.8A
chamber pressure: 1.2e-5Pa, filament current: 0.78A
bias voltage: 13.0V
问题代码(示例)
import re log_content = """ bias voltage: 12.5V, filament current: 0.8A chamber pressure: 1.2e-5Pa, filament current: 0.78A bias voltage: 13.0V """ pattern = r'(\w+\s+\w+):\s*([\d.]+)[A-Za-z]?' result = [] for line in log_content.strip().split('\n'): match = re.search(pattern, line) if match: result.append({match.group(1): match.group(2)}) print(result)
问题输出
[{'bias voltage': '12.5'}, {'chamber pressure': '1.2'}, {'bias voltage': '13.0'}]
修改后的代码
import re log_content = """ bias voltage: 12.5V, filament current: 0.8A chamber pressure: 1.2e-5Pa, filament current: 0.78A bias voltage: 13.0V """ # 正则支持匹配多单词键、带科学计数法的数值 pattern = r'(\w+(?:\s+\w+)*):\s*([\d.eE+-]+)' result = [] for line in log_content.strip().split('\n'): # 捕获当前行所有键值对 matches = re.findall(pattern, line) if matches: line_data = {} for key, value_str in matches: # 转换数值为浮点类型 line_data[key] = float(value_str) result.append(line_data) print(result)
正确输出
[{'bias voltage': 12.5, 'filament current': 0.8}, {'chamber pressure': 1.2e-05, 'filament current': 0.78}, {'bias voltage': 13.0}]
关键调整说明
- 正则表达式优化:
(\w+(?:\s+\w+)*)匹配由空格分隔的多单词键(如filament current),([\d.eE+-]+)兼容普通小数和科学计数法格式的数值。 - 全局匹配替换:用
re.findall替代re.search,一次性提取行内所有符合规则的键值对。 - 类型转换:遍历匹配结果时直接将数值字符串转为浮点类型,自动适配各类数值格式。
内容的提问来源于stack exchange,提问作者whateverornot
相关产品推荐
相关产品推荐

