2014-10-26 2 views
0

В Python 2.7.5,Регулярное выражение не совпадает, как и ожидалось

r = re.search(r'((a+)\2b)*\1', 'abaabaab') 

приведет r.group(0) быть 'aabaab', но я ожидаю, что это совпадает с пустой строкой в ​​начале 'abaabaab'. Я думаю, что это не соответствует правилу первого матча.

И я ожидаю

r = re.search(r'(c+)*\1', 'ca') 

матч с 'c', где первая группа захватывает 'c' и повторяющей нулевое время и таким образом '\1' матчи 'c'. То, что я получил под python, - 'NoneType', а osx grep возвращает 1. echo c | grep -E '(c+)*\1' ; echo $?.

Может ли кто-нибудь сказать мне, почему?

+0

Вы неверно истолковываете код возврата grep, 1 означает «нет совпадений». – georg

+0

@georg, я знаю, что означает код возврата. Я ожидаю, что он вернет 0 с совпадением. – coderfive

+0

'echo cc | grep -E '(c +) * \ 1'' – Cyrus

ответ

1

Итак, давайте

r = re.search(r'((a+)\2b)*\1', 'abaabaab') 

Вы ищете один или более «а», а затем такое же количество «а это следует один„Ъ“, то есть„ааЪ“, а затем„ааЪ“снова , Таким образом, результат совершенно ясен: по крайней мере два «а» и четное число «а», поэтому первый «аб» не может совпадать.

r = re.search(r'(c+)*\1', 'ca') 

Найти любое количество «c», за которым следует такое же количество «c». Но есть только один «c», поэтому нет соответствия. «*» Допускает нулевые совпадения, это означает, что группа не существует, а несуществующие группы не могут ссылаться на \ 1. Посмотрите:

>>> re.search(r'(c+)*(b+)*(a+)*', 'ca').groups() 
('c', None, 'a') 

Вы видите, что вторая группа не пуста, ее не существует.

+0

Я думаю, что он должен остановиться в начале, с пустой строкой. – coderfive

+0

см. Мое очищение. – Daniel

0

r = re.search(r'((a+)\2b)*\1', 'abaabaab' соответствует aabaab, потому что вы используете re.search (который поиски входной строки на матч) вместо re.match (который пытается установить соответствие шаблону в начале входной строки).

>>> print re.match(r'((a+)\2b)*\1', 'abaabaab') 
None 

r = re.search(r'(c+)*\1', 'ca') не возвращает матч, потому что он должен соответствовать четное число c символов. Это то, что происходит в деталях:

  1. (c+) совпадает с c в ca
  2. (c+)* не совпадает еще c
  3. \1 пытается установить соответствие содержимого 1-й группы (которая c), и не
  4. regex теперь должен возвращаться. (c+)* теперь ничего не совпадает с c.
  5. еще раз, \1 пытается совместить содержимое группы 1, но группа 1 не прошла успешно, поэтому это не удается.
  6. regex пытается снова вернуться, но не может - (c+)* не может сравниться ни с чем. На данный момент шаблон не соответствует.
+0

Нет, результатом является 'NoneType', что означает, что совпадение не найдено. – coderfive

+0

@coderfive: Мой плохой, ответ обновлен. –

Смежные вопросы