Сопоставление жадности и не-жадности в Python - PullRequest
1 голос
/ 01 августа 2010

Пожалуйста, помогите мне выяснить, является ли это ошибкой в ​​Python (2.6.5), в моей компетенции в написании регулярных выражений или в моем понимании сопоставления с образцом.

(Я принимаю, что возможный ответ«Обнови свой Python».)

Я пытаюсь разобрать токен Yubikey, учитывая дополнительные опции.

Когда я использую это регулярное выражение для сопоставления токена без каких-либо дополнительных дополнений (т. Е. Содержащих только то, что соответствует двум группам захвата), сопоставление завершается неудачно:

r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32})\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$'

Однако,если я сделаю первую группу нежадной:

r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32}?)\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$'

, то это удастся.

Итак, хорошо, это работает, но я бы подумал, что единственная разница в конечном результате между этими двумярегулярные выражения - это производительность.

Оба Expresso и Regex Coach похожи на оба шаблона.

Что я пропустил?


Вот две строки, которые я тестируюс.

Без дополнительных дополнений (которые могут потерпеть неудачу):

"vvbrentlnccnhgfgrtetilbvckjcegblehfvbihrdcui"

С дополнительными дополнениями (до сих пор не сработало; фактические вкладки показаны здесь как "_")

"_!_8R5Gkruvfgheufhcnhllchgrfiutujfh_"
"_!1U4Knivdgvkfthrd_brvejhudrdnbunellrjjkkccfnggbdng_"

Я попытался воспроизвести его, используя предложение Алекса Мартелли, и оно не дает сбоя в сырой среде Python, поэтому я собираюсь вернуться к своему коду (яна самом деле хакинг на юбики-питоне);Я вернусь через день или около того.


Мои извинения всем.Я не могу воспроизвести проблему.Когда это произошло, я читал ввод с помощью getpass;Я подозреваю, что на пути возникло случайное нажатие клавиши.

Я собираюсь закрыть вопрос.Если тот, кто проголосовал против, желает убрать свой голос, это справедливо.

Очень жаль.

Ответы [ 2 ]

3 голосов
/ 01 августа 2010

Я бы рекомендовал использовать yubikey-python для взаимодействия Python с yubikey - но это побочная (и строго прагматичная) проблема; -).

Теоретически,не должно быть случаев, когда выбор между жадным и не жадным приводит к тому, что RE совпадает в одном случае, а в другом - неудача - это должно влиять только на то, что сопоставляется (и, как вы упомянули, производительность), а не на то, удастся ли совпадение вообще, посколькуRE должны возвращаться для этой цели.

Проблема в том, что я не могу воспроизвести проблему - у меня нет yubikey под рукой, и тесты в этот файл не показывают различий междуповедение совпадений / несоответствий двух RE.

Не могли бы вы опубликовать пару неудачных примеров (где один соответствует, а другой нет), в идеале, отредактировав ваш вопрос, чтобы я мог воспроизвестипроблема и попытаться сократить его до минимума?Похоже, что может быть ошибка RE, но без воспроизводимых случаев я не могу проверить, если и когда она была исправлена, уже сообщена, или что.Спасибо!

Редактировать ОП опубликовал один неудачный пример, но я до сих пор не могу воспроизвести:

$ py26
Python 2.6.5 (r265:79359, Mar 24 2010, 01:32:55) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> r1 = re.compile(r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32})\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$')
>>> r2 = re.compile(r'^\t?[^a-z0-9]?([cbdefghijklnrtuv1-8]{0,32}?)\t?([cbdefghijklnrtuv1-8]{32})\t?\r?\n?$'
... )
>>> nox="vvbrentlnccnhgfgrtetilbvckjcegblehfvbihrdcui"
>>> r1.match(nox)
<_sre.SRE_Match object at 0xcc458>
>>> r2.match(nox)
<_sre.SRE_Match object at 0xcc920>
>>> 

, т. Е. Совпадение в обоих случаях успешно, так какдолжен - и это точно такая же версия Python 2.6.5, которую использует OP.OP, пожалуйста, покажите результаты этой простой последовательности команд на вашей платформе и расскажите нам, что это за платформа, поскольку она выглядит как странная ошибка, зависящая от платформы ... спасибо!

0 голосов
/ 01 августа 2010

Вы правы: простой переход с жадных на не жадные квантификаторы не должен приводить к тому, что регулярное выражение перестает работать. Он может изменить то, насколько быстро регулярное выражение совпадает (или не соответствует), как много оно соответствует, и какие части захватываются в какие группы, вот и все.

(Следующее «решение» не применимо, но вопрос по-прежнему не указывает на то, что выполняется сравнение без учета регистра, поэтому я оставлю его.)

Ваша проблема в том, что в строках с дополнительными дополнениями также есть заглавные буквы, а регулярное выражение допускает только строчные буквы. Наклейте (?i) на передний план или в регулярное выражение, и все будет работать отлично.

...