【问题标题】:Python Regex Negative LookbehindPython 正则表达式负回溯
【发布时间】:2012-12-06 13:01:06
【问题描述】:

(?<!(asp|php|jsp))\?.* 模式在 PCRE 中有效,但在 Python 中无效。

那么我该怎么做才能让这个正则表达式在 Python 中工作呢? (Python 2.7)

【问题讨论】:

  • 怎么不行?它会给出错误吗?如果是这样,请发布错误。它与您的期望不符吗?如果是这样,请将代码发布在您使用它的位置,并显示您获得的输出与您期望的输出。
  • 这里是 re 模块的 doc,明确声明支持否定的后向断言。
  • 只要所有备选方案都具有相同的长度,负向后追溯就可以正常工作。所以这有效(?<!asp|php|jsp),但不是这(?<!asp|php|html)
  • @georg 你将如何通过lookbehinds适应不同长度的字符串?
  • @physlexic: 正则表达式 (pypi.python.org/pypi/regex) 可以做到这一点

标签: python regex pcre negative-lookbehind


【解决方案1】:

它对我来说非常好用。你可能用错了吗?确保使用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)\?.*

【讨论】:

  • ... 和re.search(r"(?&lt;!(asp|php|jsp))\?.*", s).group() 给出'?1=123'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多