Python Regex匹配结构化日志提取时间、用户、标签及多行关联内容
Python正则匹配多行日志记录解决方案
问题原因
- Python re模块默认配置下,
.元字符不匹配换行符,原有正则的末尾(.*)只能捕获正文的第一行内容 - 未明确多行正文的终止边界,无法判定当前记录的正文何时结束
正确实现代码
import re text2 = """2021-01-01 10:00:05 - Surname1 Name1 (Comment) Blablabla Blabla 2021-01-01 23:00:05 - Surname2 SurnameBis Name2 (WorkNotes) What? I don't know? Can you be clear? 2021-01-02 03:00:05 - Surname1 Name1 (Comment) Blablabla!""" # 正则模式 + re.DOTALL 标志 pattern = r"(\d{4}-\d{2}-\d{2})\s(\d{2}:\d{2}:\d{2})\s-\s(.*?)\((.*?)\)\n(.*?)(?=\n\d{4}-\d{2}-\d{2}|\Z)" LangTag = re.findall(pattern, text2, flags=re.DOTALL) # 可选操作:清除姓名字段末尾多余的空格 LangTag = [(date, time, name.strip(), tag, content) for date,time,name,tag,content in LangTag] print(LangTag)
关键说明
- 不需要修改原文本的换行符,所有原换行都会保留在最后一个正文分组中,满足后续业务使用需求
- 正向预查
(?=\n\d{4}-\d{2}-\d{2}|\Z)属于零宽匹配,不会消耗下一条记录的开头内容,保证每条记录都能被完整匹配 - 所有
.*?使用非贪婪匹配,避免分组内容溢出到后续字段
运行后输出的结构与需求完全一致。
内容的提问来源于stack exchange,提问作者Renaud
相关产品推荐
相关产品推荐

