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]+)
解决方案
如果我尝试这个,它匹配 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 中存在这种严重性的错误,我很确定我会听说过它。
所以它不是版本,也不是正则表达式本身。剩下的数据可能看起来与您的问题中的样子不太一样,或者是围绕检查的代码。
推荐阅读
- intellij-plugin - Intellij Compound 和 Multirun 插件的限制和挑战
- angular - 在 IE10 中将日历更改为法语的问题
- java - 不使用 FXML 从另一个类访问 Javafx 元素
- wordpress - 如何在古腾堡 wordpress 中创建自定义嵌入块
- sql - 有没有办法确保 WHERE 子句在 DISTINCT 之后发生?
- c++ - rdtsc乱序执行的解决方案?
- java - 数字日期格式
- angular - 当使用异步管道在 NGXS 存储中更改状态时,Angular 组件不会重新评估
- sql - 过滤视图时如何利用基础索引?
- c# - 我需要使用 xpath 在我的 HTML 中获取没有标签的文本