首页 > 解决方案 > Python多行正则表达式在每个时间戳后提取文本

问题描述

我有一个正在尝试解析的日志文件。每个日志在一行的开头都有一个时间戳,格式YYY-MMM-DD HH:MM:SS.SSSSSS -0400:为时区信息是可选的(我现在可以忽略)。我可以很好地匹配这些,但不能匹配时间戳之后的日志,它可能立即在同一行或下一行开始,并且可能有多行长。我对正则表达式很满意,但我很少做多行正则表达式。

这是我尝试过的似乎是壁橱的东西

# finds the first timestamp, everything to end of file is the log
re.findall('\n(^\d{4}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2}.\d{6}).*?:(.*)', log, re.DOTALL)

# finds every timestamp, all logs are empty (obviously too un-greedy)
re.findall('\n(^\d{4}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2}.\d{6}).*?:(.*?)', log, re.DOTALL)

我只是不知道如何获取随后的日志,但如果看到另一个时间戳就停止。

标签: pythonregex

解决方案


您可以使用后跟日期时间模式的换行符拆分内容:

re.split(r'\n(?=\d{4}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2}\.\d{6})', log)

细节

  • \n- 换行符
  • (?=\d{4}-[A-Za-z]{3}-\d{2} \d{2}:\d{2}:\d{2}\.\d{6})- 正向前瞻,需要以下模式立即出现在当前位置的右侧:
    • \d{4}-- 四位数字和一个连字符
    • [A-Za-z]{3}-- 三个字母和一个连字符
    • \d{2}- 两位数
    • - 一个空间
    • \d{2}:- 两位数和:
    • \d{2}:\d{2}- - 两位数, :, 两位数
    • \.- 一个(注意它必须被转义)
    • \d{6}- 六位数

推荐阅读