разница между двумя регулярными выражениями: + и () +

In [29]: re.findall("([abc])+","abc") Out[29]: ['c'] In [30]: re.findall("[abc]+","abc") Out[30]: ['abc'] 

Смущенный сгруппированным. Как это имеет значение?

  • Веб-службы Python
  • Google App Engine с Eclipse?
  • Формат строки Python: когда использовать флаг конверсии!
  • OpenCV для Python 3.x под Windows
  • Python 3: ImportError «Нет модуля с именем Setuptools»
  • Комплексный запрос с Django (сообщения от всех друзей)
  • Избранные приложения с открытым исходным кодом Google App Engine (Java или Python)
  • Поддерживаются ли контейнеры C ++ 11 Cython?
  • 5 Solutions collect form web for “разница между двумя регулярными выражениями: + и () +”

    Здесь нужно объяснить две вещи: поведение количественных групп и дизайн метода findall() .

    В вашем первом примере [abc] соответствует a , который фиксируется в группе # 1. Затем он соответствует b и фиксирует его в группе # 1, перезаписывая a . Затем снова с c , и это то, что осталось в группе №1 в конце матча.

    Но он соответствует всей строке. Если вы использовали search() или finditer() , вы могли бы посмотреть на MatchObject и увидеть, что group(0) содержит abc а group(1) содержит c . Но findall() возвращает строки, а не MatchObjects. Если групп нет, он возвращает список общих совпадений; если есть группы, список содержит все захваты, но не общее совпадение.

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

    В первом примере у вас есть повторная захваченная группа, которая захватывает только последнюю итерацию. Здесь c .

     ([abc])+ 

    Визуализация регулярных выражений

    Демоверсия Debuggex

    Во втором примере вы сопоставляете один символ в списке один и неограниченное количество раз.

     [abc]+ 

    Визуализация регулярных выражений

    Демоверсия Debuggex

    Вот как я мог бы подумать об этом. ([abc])+ пытается повторить захваченную группу. Когда вы используете «+» после группы захвата, это не означает, что вы собираетесь получить две захваченные группы. То, что заканчивается, по крайней мере для регулярного выражения Python и большинства реализаций, заключается в том, что «+» заставляет итерацию, пока группа захвата не содержит только последнее совпадение.

    Если вы хотите записать повторяющееся выражение, вам нужно отменить порядок «(…)» и «+», например, вместо ([abc])+ use ([abc]+) .

    ввод "abc"

     [abc] 

    соответствует одному символу => "a"

     [abc]+ 

    + Между одним и неограниченным временем, как можно больше раз => "abc"

     ([abc]) 

    Группа захвата ([abc]) => "a"

     ([abc])+ 

    + Повторная группа захвата будет захватывать только последнюю итерацию => "c"

    Группировка дает разные предпочтения.

    ([abc])+ => Найти один из выбора. Может соответствовать одному или нескольким. Он находит, что все условия соблюдены как + означает 1 или более. Это разлагает регулярное выражение на два этапа.

    В то время как разгруппированный рассматривается как целое.

    Python - лучший язык программирования в мире.