我正在关注带有正则表达式的数据。我的数据有以下模板:
Timestamp 1549033386 ID=02141592cc0000000700000000000000 Dest_ID=02141592cc00000007ffffffb0ba2c53 Nbr_packet_not_acK_ti9-ti5 -91
我正在使用python,并且实现了此正则表达式:
'Nbr_packet_not_acK_ti9-ti5': r'\bTimestamp\s+([0-9]+)\s+ID=(\w{32})0*\s+Dest_ID=(\w{32})0*\sNbr_packet_not_acK_ti9-ti5\s+([0-9]+)',
但是它不能正常工作,问题出在我的负值上。
我还有另一个可以正常工作的示例:
Timestamp 1549033599 ID=02141592cc0000000600000000000000 Dest_ID=00000000000000000000000000000000Delay_T2R2 -1
\bTimestamp\s+([0-9]+)\s+ID=(\w{32})0*\s+Dest_ID=(\w{32})0*Delay_T2R2\s+(-?[0-9]+)
答案 0 :(得分:1)
如果我尝试此操作,它将匹配3个组:
1549033386
02141592cc0000000700000000000000
02141592cc00000007ffffffb0ba2c53
,但是由于尾随([0-9]+)
,整个正则表达式不匹配,正如您正确地指出的那样,它不匹配负数。可以通过以下方式来修复正则表达式:
\bTimestamp\s+([0-9]+)\s+ID=(\w{32})0*\s+Dest_ID=(\w{32})0*\sNbr_packet_not_acK_ti9-ti5\s+([-0-9]+)
或按Engineero建议的这种方式:
\bTimestamp\s+([0-9]+)\s+ID=(\w{32})0*\s+Dest_ID=(\w{32})0*\sNbr_packet_not_acK_ti9-ti5\s+(-?[0-9]+)
使我对所有4个捕获组完全匹配。
1549033386
02141592cc0000000700000000000000
02141592cc00000007ffffffb0ba2c53
-91
因此,我得出结论说,任何一种修复方法实际上都可以起作用,并且您报告的不匹配项是由混淆错误引起的。
要证明它一定是一个令人困惑的错误,请在解释器提示符处尝试以下操作,以消除此类错误:
>>> exp = r"\bTimestamp\s+([0-9]+)\s+ID=(\w{32})0*\s+Dest_ID=(\w{32})0*\sNbr_packet_not_acK_ti9-ti5\s+(-?[0-9]+)"
>>> rx = re.compile(exp)
>>> m=rx.match("Timestamp 1549033386 ID=02141592cc0000000700000000000000 Dest_ID=02141592cc00000007ffffffb0ba2c53 Nbr_packet_not_acK_ti9-ti5 -91")
>>> m.groups()
('1549033386', '02141592cc0000000700000000000000', '02141592cc00000007ffffffb0ba2c53', '-91')
我在Python 2.5、2.7、3.6和3.7中进行了尝试。我已经没有3.5了,但是如果在3.5中出现了这种严重性的错误,我敢肯定我会听说的。
所以它不是版本,也不是正则表达式本身。剩下的数据可能看起来不像您问题中的样子,也不是支票周围的代码。