我想知道如何处理可能跨越文本文件中多行的匹配日志条目,特别是使用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}].*')
答案 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.S
和re.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)