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

#python #regex

Вопрос:

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

Что вызывает эти два разных результата?

 >>> x = re.compile(r'Johns(?:Doe)')
>>> result = x.match("John Doe")
>>> result.group()
'John Doe'
>>> result.group(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group
 
 >>> x = re.compile(r'Johns(?:(Doe))')
>>> result = x.match("John Doe")
>>> result.group()
'John Doe'
>>> result.group(1)
'Doe'
 

Комментарии:

1. Чего вы ожидали от них соответственно?

2. В вашем втором примере есть две группы: внешняя, которая не захватывает, и внутренняя, которая захватывает.

Ответ №1:

?: Оператор в начале группы в основном говорит: «Не помните меня». Это полезно при создании регулярных выражений, когда вам нужно сопоставить несколько элементов, но на самом деле результаты вам не нужны. Лайк (?:foo|bar) будет соответствовать как foo, так и bar, но он не будет записан в списке групп.

Итак, в вашем первом примере нет группы, которую нужно запомнить, потому ?: что вы указали, чтобы она этого не делала, — таким образом, ошибка для group(1) .

Во втором случае вы фактически дважды() цитируете выражение без необходимости. (?:(Doe)) в основном это то же (Doe) самое, что и .

Ответ №2:

На основе применения https://regex101.com/ веб-сайт, на котором я получил этот результат

Первый Случай Повторяется

Второй Случай Повторяется

Как я пришел к выводу, возможно, это похоже на массив, как работают группы, как вы должны думать, в котором каждый вложенный и сопоставленный объект с номером помечен как ключ к поиску группы

['John Doe', ['Doe']] и он сопоставлен с объектом и с числовым значением в качестве ключа для доступа к целевой группе для второго повторения.