跨多行匹配日志条目

时间:2018-09-25 20:53:56

标签: python regex

我想知道如何处理可能跨越文本文件中多行的匹配日志条目,特别是使用python。

[yyyy/mm/dd time] Entry
[yyyy/mm/dd time] this is
a multiline
entry
[yyyy/mm/dd time] Another entry

所以在这种情况下我的正则表达式应该有3个匹配项。

充其量,我有一个与每一行匹配的正则表达式,但是对于涉及到多行的日志条目,这是不够的:

regex = re.compile(\[\d{4}\/\d{2}\/\d{2}.{31}].*')

2 个答案:

答案 0 :(得分:2)

您可以遍历行并检查是否有匹配项-如果找到匹配项,则添加新的日志条目,如果没有找到该行,则将该行追加到先前捕获的日志中,即:

LINE_START = re.compile(r"\[\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2}")  # etc.

with open("path/to/your.log", "r") as f:
    log_lines = [next(f)]  # a list to hold the log lines, initiate with the first line
    for line in f:
        if LINE_START.match(line):  # a new log line found
            log_lines.append("")  # 'register' a new log entry
        log_lines[-1] += line  # append the line to the last log entry

答案 1 :(得分:0)

您可以使用re.Sre.MULTILINE使点匹配换行符,并使用^匹配换行符。

然后,匹配两个时间戳之间或时间戳与字符串结尾之间的所有内容。

regex = re.compile("^\[\d{4}\/\d{2}\/\d{2}[^\]]*](.*?)(?=^\[\d{4}\/\d{2}\/\d{2}[^\]]*])|^\[\d{4}\/\d{2}\/\d{2}[^\]]*](.*?)(?!.)",re.S | re.MULTILINE)

测试:https://regex101.com/r/dR25vY/2