Сопоставление жадности и не-жадности в Python

1

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

(Я согласен с тем, что возможный ответ: "Обновите свой Python".)

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

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

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_"

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


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

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

Очень жаль.

  • 2
    Это поможет, если вы разместите строку, на которую ссылаетесь.
  • 0
    против чего вы подходите?
Показать ещё 2 комментария
Теги:
greedy
non-greedy

2 ответа

3
Лучший ответ

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

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

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

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

Изменить OP теперь опубликовал один неудачный пример, но я все еще не могу воспроизвести:

$ 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>
>>> 

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

  • 0
    @FM, да, TX, исправление сейчас.
  • 0
    Алекс, хотя у меня не было вопросов, я воспринял твой ответ как самый продуманный и информативный. Никаких размышлений о других ответах, хотя!
0

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

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

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

  • 0
    но ОП сказал, что он испытывает сбои только в строках без необязательных дополнений, поэтому наличие заглавных букв в необязательных дополнениях кажется несоответствующим его заявленной проблеме.
  • 1
    @ Алекс: Так он и сделал, но когда я проверял это, строка «без» соответствовала , а строка «с» - нет. Кажется, я неосознанно пересмотрел вопрос, чтобы соответствовать наблюдаемому поведению. Мы мошенничаем или как? ;)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню