【发布时间】:2020-06-03 21:21:05
【问题描述】:
目标是让正则表达式匹配所有前面没有 2 位十进制数字的换行符。这是一些示例文本:
This line ends with text
this line ends with a number: 55
this line ends with a 2-decimal number: 5.00
here's 22.22, not at the end of the line
Regex 应该匹配第 1、2 和 4 行的结尾(假设第 4 行之后有一个换行符)。我认为否定前瞻是答案,所以我尝试了
(?!\d*\.\d\d)\n
在这个 regex101 sn-p 中看到没有成功:https://regex101.com/r/qbrKlt/4
编辑:我后来发现这不起作用的原因是因为 Python 的 Regex 不支持可变长度的负前瞻 - 它只支持固定长度的负前瞻。
不幸的是,固定长度的前瞻仍然不起作用:
(?!\.\d\d)\n
相反,我通过运行正则表达式两次并减去结果来解决问题:
- 查找换行符的所有索引:
\n - 查找所有以 2 位小数开头的换行符索引:
\d*\.\d\d\n - 从第 1 步中找到的索引中删除第 2 步中找到的索引以获得答案
但我确信有一种方法可以一次性做到这一点,我会感谢任何可以帮助发现解决方案的人:)
【问题讨论】:
-
为什么要匹配第二行?
-
Python 的正则表达式不支持可变长度的负前瞻 - 错误,
re支持可变宽度的前瞻。它不支持未知宽度的 lookbehind 模式。 -
不正确的欺骗:这个问题不仅仅是关于使用lookbehind,而是关于在python中处理一个非常具体的未知宽度lookbehind模式的案例。
标签: python regex regex-lookarounds regex-negation