Python Regex Отрицательный взгляд назад

Шаблон (?<!(asp|php|jsp))\?.* работает в PCRE, но не работает в Python.

Итак, что я могу сделать, чтобы это регулярное выражение работало в Python? (Питон 2.7)


person Matt Elson    schedule 19.12.2012    source источник
comment
Как это не работает? Выдает ошибку? Если да, напишите об ошибке. Это не соответствует тому, что вы ожидаете? Если это так, разместите код там, где вы его используете, и покажите результат, который вы получаете, по сравнению с тем, что вы ожидаете.   -  person BrenBarn    schedule 19.12.2012
comment
Вот документ для модуля re, в котором четко указана поддержка отрицательных утверждений просмотра назад. .   -  person Chris Seymour    schedule 19.12.2012
comment
Отрицательные просмотры назад работают, пока все альтернативы имеют одинаковую длину. Так что это работает (?<!asp|php|jsp), но не (?<!asp|php|html).   -  person georg    schedule 19.12.2012
comment
@georg, как бы вы адаптировали строки разной длины с помощью lookbehind?   -  person physlexic    schedule 27.10.2017
comment
@physlexic: регулярное выражение (pypi.python.org/pypi/regex) может сделать это   -  person georg    schedule 27.10.2017


Ответы (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)\?.*
person Martin Ender    schedule 19.12.2012
comment
... и re.search(r"(?<!(asp|php|jsp))\?.*", s).group() дает '?1=123'. - person glglgl; 19.12.2012