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

如何用Python正则分割包含指定日志级别的完整日志条目?

解决日志文件解析问题

问题分析

你当前使用re.split时出现多余元素的原因是正则中包含多个捕获组,re.split会将每个捕获组的匹配结果也纳入返回列表,同时把日志级别和内容分离,导致结果混乱。

解决方案1:使用re.findall(推荐)

直接匹配每个完整的日志条目,这是最简洁的方法。通过正则匹配以[级别]开头的整行内容,利用非捕获组避免多余的分组结果:

import re

all_logs = """[INFO]: Waiting for application shutdown.
[INFO]: Application shutdown complete.
[INFO]: Finished server process"""

# 正则说明:
# ^ 匹配行首,$ 匹配行尾
# (?:...) 非捕获组,仅用于分组而不保留匹配结果
# re.MULTILINE 让^和$匹配每行的首尾,而非整个字符串的首尾
pattern = r'^\[(?:DEBUG|INFO|WARNING|ERROR)\]: .*$'
parsed_logs = re.findall(pattern, all_logs, re.MULTILINE)
print(parsed_logs)

输出结果:

['[INFO]: Waiting for application shutdown.', '[INFO]: Application shutdown complete.', '[INFO]: Finished server process']

解决方案2:修复re.split的用法

如果你坚持使用re.split,可以调整正则为非捕获组,然后将分隔符(日志级别)与后续内容拼接:

import re

all_logs = """[INFO]: Waiting for application shutdown.
[INFO]: Application shutdown complete.
[INFO]: Finished server process"""

# 使用非捕获组避免多余分组
logLevelRegex = r'(\[(?:DEBUG|INFO|WARNING|ERROR)\])'
split_result = re.split(logLevelRegex, all_logs)

# 过滤空内容并拼接级别与日志内容
parsed_logs = []
for i in range(1, len(split_result), 2):
    level = split_result[i]
    content = split_result[i+1].strip()
    if level and content:
        parsed_logs.append(f"{level}: {content}")

print(parsed_logs)

输出结果与方案1一致。

内容的提问来源于stack exchange,提问作者Michael Pesce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:43:30