Что не так с моим регулярным выражением? - PullRequest
0 голосов
/ 05 июля 2010

Я ожидаю, что строка НЕ ​​будет соответствовать регулярному выражению, но это так!

>>> re.compile('^P|([LA]E?)$').match('PE').group()
'P'

Это похоже на ошибку, потому что я не вижу пути для совпадения $. С другой стороны, кажется маловероятным, что библиотека Python не сможет справиться с этим простым случаем. Я что-то здесь упускаю?

Кстати, Python распечатывает это при запуске:

Python 2.5.4 (r254: 67916, 23 декабря 2008, 15:10:54) [MSC v.1310 32 бит (Intel)] на win32 Введите «помощь», «авторское право», «кредиты» или «лицензия» для получения дополнительной информации.

Ответы [ 5 ]

4 голосов
/ 05 июля 2010
^P|([LA]E?)$

становится

^P
|
([LA]E?)$
3 голосов
/ 05 июля 2010

Вы написали "P or ([LA] E?)". "P" соответствует.

Если вы хотели, чтобы якоря применялись в обоих случаях, возможно, вы имели в виду следующее:

^ (?: P |? ([LA] E)) $

2 голосов
/ 05 июля 2010

Два других момента, о которых стоит упомянуть: ^ является избыточным при использовании re.match(), а если вы хотите сопоставить конец строки, используйте r "\Z", а не "$".

Почему $ это зло: Предположим, мы хотим проверить, что вся строка s соответствует некоторому шаблону foo. Мы не хотим называть это совпадением, если после шаблона есть что-то. Посмотрим, что произойдет, если после шаблона появится новая строка.

>>> import re
>>> s = 'foo\n'
>>> re.match('foo$', s)
<_sre.SRE_Match object at 0x00BAFE90> # match -- FAIL!
>>> re.match('foo\Z', s) # no match -- OK
>>>

Вот выдержки из документов :

Документы для $: Соответствует концу строки или непосредственно перед новой строкой в ​​конце строки ... это использует режимы по умолчанию и является ничего общего с режимом MULTILINE.

Документы для \Z: Соответствует только в конце строки . Ничего общего с модами и не пугающими новыми строками.

1 голос
/ 05 июля 2010

Это будет соответствовать либо ^P, либо ([LA]E)$. Вы имели в виду ^(?:P|([LA]E?))$ вместо?

0 голосов
/ 05 июля 2010

Он печатает одинаковые выходные данные в Mac OS X и в Linux (тестирование Debian).Я был бы удивлен, увидев, что ошибка ведет себя одинаково на трех основных платформах.Кроме того, «PE» имеет «P» в начале, поэтому я не вижу проблемы в том, чтобы соответствовать регулярному выражению.Аналогично, «AE» также соответствует регулярному выражению.Как в Debian, так и в Mac OS X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...