如何用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
相关产品推荐
相关产品推荐

