#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']]
и он сопоставлен с объектом и с числовым значением в качестве ключа для доступа к целевой группе для второго повторения.