Пожалуйста, помогите мне узнать, является ли это ошибкой в 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
; Я подозреваю, что случайное чужое нажатие клавиши мешало.
Я собираюсь закрыть вопрос. Если тот, кто поддержал этот вопрос, хочет удалить свой голос, это справедливо.
Очень жаль.
Я бы рекомендовал использовать 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, показать результаты этой простой последовательности команд на вашей платформе и точно рассказать, что такое платформа, поскольку она выглядит как странная ошибка, зависящая от платформы... спасибо!
Вы правы: просто переключение с жадных на неживые кванторы не должно вызывать регулярное выражение, чтобы перестать работать. Он может изменить, насколько быстро регулярное выражение соответствует (или не соответствует), насколько оно соответствует, и какие части захватываются в каких группах, что все.
(Следующее "решение" не применимо, но вопрос по-прежнему не указывает на то, что выполняется нечувствительность к регистру, поэтому я оставлю его.)
Ваша проблема в том, что строки с дополнительными дополнениями также имеют в них прописные буквы, а ваше регулярное выражение допускает только буквы нижнего регистра. Прикрепите (?i)
к фронту или к регулярному выражению, и он отлично работает.