我有从服务器检索到的错误日志数据,它的格式如下:

文本文件:

2018-01-09 04:50:25,226 [18] INFO messages starts here line1 \n
    line2 above error continued in next line
2018-01-09 04:50:29,226 [18] ERROR messages starts here line1 \n
    line2 above error continued in next line
2018-01-09 05:50:29,226 [18] ERROR messages starts here line1 \n
    line2 above error continued in next line


我需要检索错误/信息性消息以及日期时间戳。

已经在python中编写了以下代码,并且如果错误消息仅在一行中,则可以正常工作,但是如果在多行中记录了相同的错误,则无法正常工作(在这种情况下,它仅给出一行作为输出,但是如果属于则我需要下一行到相同的错误)。

如果您提供任何解决方案/想法,将很有帮助。

下面是我的代码:

 f = open('text.txt', 'r', encoding="Latin-1")
 import re
 strr=re.findall(r'(\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2})(\,\d{1,3}\s\[\d{1,3}\]\s)(INFO|ERROR)(.*)$', f.read(), re.MULTILINE)
 print(strr)


上面的代码给出的输出为:


  [(''2018-01-09 04:50:25',',226 [18]','INFO','消息从这里开始
  line1'),('2018-01-09 04:50:29',',226 [18]','ERROR','消息开始
  这里line1'),('2018-01-09 05:50:25',',226 [18]','ERROR','消息
  从这里开始line1')]


正如我期望的那样


  [(''2018-01-09 04:50:25',',226 [18]','INFO','消息从此处开始
  第2行以上错误在下一行中继续)',('2018-01-09
  04:50:29',',226 [18]','ERROR','消息从此处的第1行第2行开始
  错误继续在下一行'),('2018-01-09 05:50:29',',226
  [18]“,'ERROR','消息从此处开始,第1行,第2行,错误继续
  在下一行')]

最佳答案

正则表达式:(\d{4}(?:-\d{2}){2}\s\d{2}(?::\d{2}){2})(,\d+[^\]]+\])\s(INFO|ERROR)\s([\S\s]+?)(?=\r?\n\d{4}(?:-\d{2}){2}|$)

Python代码:

import re

matches = re.findall(r'(\d{4}(?:-\d{2}){2}\s\d{2}(?::\d{2}){2})(,\d+[^\]]+\])\s(INFO|ERROR)\s([\S\s]+?)(?=\r?\n\d{4}(?:-\d{2}){2}|$)', text)


输出:

[('2018-01-09 04:50:25', ',226 [18]', 'INFO', 'messages starts here line1\nline2 above error continued in next line'), ('2018-01-09 04:50:29', ',226 [18]', 'ERROR', 'messages starts here line1\nline2 above error continued in next line'), ('2018-01-09 05:50:29', ',226 [18]', 'ERROR', 'messages starts here line1\nline2 above error continued in next line')]


Code demo

关于python - 检索数据,直到与下一个正则表达式模式匹配为止,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48746812/

10-11 07:46