【发布时间】:2021-07-06 13:07:59
【问题描述】:
我正在尝试在正则表达式中使用后视后跟一个懒惰的“匹配所有模式”(.+?),但我想知道是否可以通过这种方式使用环视。
例如,我有以下正则表达式:(?<!learn).+?write a regex
-
"I'm learning how to write a regex"(不应匹配) -
"I know how to write a regex"(应该匹配) -
"I know how to read an write a regex"(应该匹配) -
"I want to know how to write a regex"(应该匹配) -
"I want to learn how to write a regex"(不应匹配)
如果你使用上面的正则表达式,你会得到所有匹配的东西。
【问题讨论】:
-
一切都匹配,因为正则表达式在
write a regex左侧找到与learn不匹配的任何字符串。因此,在您的第一个示例中,I'm l与 learn 不匹配,因此负后向为 TRUE,然后earning how to匹配.+?n,write a regex匹配结束。 -
是的,我就是这么想的...所以我不能使用lookbehind后跟FIND ANY模式:/
-
我不知道如何简单地说“包含 X,但不包含 Y”。当然在 Python 中你可以测试同一个字符串两次...
-
可以使用在开头锚定的负前瞻
^(?!.*learn).*write a regex可以使用,否则另一种解决方案是首先匹配不想要的模式:(learn.*write a regex)|write a regex并执行 no-op if第一组被捕获。由于回溯的工作原理,替代部分是按顺序检查的 -
@Chris Maurer 是的,我做到了,但是以这种方式衡量我的正则表达式的精度真的很痛苦......
标签: python-3.x regex regex-lookarounds