首页 > 解决方案 > 如何制作具有负值或非负值的正则表达式?

问题描述

我专注于使用正则表达式的数据。我的数据有这个模板:

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

标签: python

解决方案


如果我尝试这个,它匹配 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 中存在这种严重性的错误,我很确定我会听说过它。

所以它不是版本,也不是正则表达式本身。剩下的数据可能看起来与您的问题中的样子不太一样,或者是围绕检查的代码。


推荐阅读