Python 在匹配之前选择第一个日期,直到找到另一个匹配

Python 在匹配之前选择第一个日期,直到找到另一个匹配,python,regex,Python,Regex,我正在努力将一个使用grep的正则表达式转换成Python 基本上,它是一个非二进制文件,所以它在日志消息中非常混乱 我想做的是做一个匹配,在第一次找到邮票时向后看,然后向前看,直到找到匹配 让我举个例子 正文 23:31:57.968:VERBOSE:NanoPC接收到心跳23:54:07.968:INFORMATION:InformationEventTriggered123服务器IP:Unknown,协议:TCP客户端ID:1 23:55:57.968:VERBOSE:NanoPC接收到心

我正在努力将一个使用grep的正则表达式转换成Python

基本上,它是一个非二进制文件,所以它在日志消息中非常混乱

我想做的是做一个匹配,在第一次找到邮票时向后看,然后向前看,直到找到匹配

让我举个例子

正文

23:31:57.968:VERBOSE:NanoPC接收到心跳23:54:07.968:INFORMATION:InformationEventTriggered123服务器IP:Unknown,协议:TCP客户端ID:1 23:55:57.968:VERBOSE:NanoPC接收到心跳23:56:57.968:VERBOSE:NanoPC接收到心跳23:59:07.968:WARNING:WarningEventTriggered123服务器IP:Unknown,协议:TCP客户端ID:1

预期产量

捕获每次写入InformationEventTriggered或WarningEventTriggered时,将时间戳移到左侧并选择所有内容,直到clientID。 在本例中,有两个匹配项:

23:31:57.968:详细:从NanoPC接收到心跳23:54:07.968:信息:InformationEventTriggered123服务器IP:未知,协议:TCP 23:59:07.968:警告:WarningEventTriggered123服务器IP:未知,协议:TCP 我试过什么 我正在使用re-Python:

(\d{2}:\d{2}:\d{2}.\d{3}.*)(InformationEventTriggered\#|WarningEventTriggered\#).*(?=ClientID)
第一组选择日期,然后选择所有内容。*直到事件消息发送到clientID

可悲的是,它不起作用:

欢迎任何帮助。

您可以使用

r'\b(\d{2}:\d{2}:\d{2}\.\d{3}:(?:(?!\b\d{2}:\d{2}:\d{2}\.\d{3}:).)*?)((?:Information|Warning)EventTriggered#)(.*?)(?=ClientID|\Z)'
详情请参阅:

\b字边界 \d{2}:\d{2}:\d{2}\.\d{3}:?:\b\d{2}:\d{2}:\d{2}\.\d{3}:.*-第一组: \d{2}:\d{2}:\d{2}\.\d{3}-2位,2位,2位,3位 :-冒号 ?:?!\b\d{2}:\d{2}:\d{2}\.\d{3}:.*-任何字符,0+次,但尽可能少,不开始一系列初始模式,见上文 ?:信息|警告事件触发-第2组:信息或|警告,然后事件触发 .*? - 第3组:任何0+字符尽可能少 ?=ClientID |\Z-直到第一次出现ClientID或字符串结尾。 :

输出:

Group 1: 23:54:07.968: INFORMATION: 
Group 2: InformationEventTriggered#
Group 3: 123 (serverIP:Unknown, protocol:TCP) 
Group 1: 23:59:07.968: WARNING: 
Group 2: WarningEventTriggered#
Group 3: 123 (serverIP:Unknown, protocol:TCP) 

这非常有效,我只需要在第一个小时之前稍微调整一下\d{2}有一个随机数和字母,因为日志没有解析好。请看这里的第二个条目,有没有办法处理它?@AlejandroA您可以删除\b然后。看见
Group 1: 23:54:07.968: INFORMATION: 
Group 2: InformationEventTriggered#
Group 3: 123 (serverIP:Unknown, protocol:TCP) 
Group 1: 23:59:07.968: WARNING: 
Group 2: WarningEventTriggered#
Group 3: 123 (serverIP:Unknown, protocol:TCP)