You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:42:00