如何使正则表达式具有负值或非负值?

时间:2019-02-01 16:06:55

标签: python

我正在关注带有正则表达式的数据。我的数据有以下模板:

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]+)

1 个答案:

答案 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中出现了这种严重性的错误,我敢肯定我会听说的。

所以它不是版本,也不是正则表达式本身。剩下的数据可能看起来不像您问题中的样子,也不是支票周围的代码。