在PCRE中,正则表达式的负向回顾后发断言有效,但在Python中无效。

24

这个正则表达式(?<!(asp|php|jsp))\?.*在PCRE中有效,但在Python中却无法工作。

那么我该如何使这个正则表达式在Python 2.7中生效呢?


6
它为什么不能工作?它会出错吗?如果是这样,请发布错误信息。如果它与您的期望不符合,那么请发布您使用它的代码,并显示您得到的输出与您期望的输出之间的差异。 - BrenBarn
这里是 re 模块的文档,明确说明了支持负回顾断言。 - Chris Seymour
3
只要所有的替代方案长度相同,负向回顾在正则表达式中可以使用。因此,(?<!asp|php|jsp) 是可以使用的,但 (?<!asp|php|html) 不行。 - georg
@georg,你怎么处理具有不同长度的字符串的lookbehind? - physlexic
1
@physlexic:正则表达式(https://pypi.python.org/pypi/regex/)可以做到这一点。 - georg
1个回答

25

对我来说它完全正常运行。 也许你在错误地使用它? 确保使用 re.search 而不是 re.match

>>> import re
>>> s = 'somestring.asp?1=123'
>>> re.search(r"(?<!(asp|php|jsp))\?.*", s)
>>> s = 'somestring.xml?1=123'
>>> re.search(r"(?<!(asp|php|jsp))\?.*", s)
<_sre.SRE_Match object at 0x0000000002DCB098>

这正是您的模式应该表现的方式。就像glglgl提到的那样,如果您将Match对象分配给一个变量(比如m),然后调用m.group(),就可以得到匹配结果?1=123

顺便说一下,你可以省略内部括号。这个模式等价于:

(?<!asp|php|jsp)\?.*

1
...而re.search(r"(?<!(asp|php|jsp))\?.*", s).group()则返回'?1=123' - glglgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接