Сообщить об ошибке.

Группы без захвата в регулярных выражениях

Регулярные выражения могут использовать много групп, как для сбора интересующих подстрок, так и для группировки и структурирования самого регулярного выражения. В сложных выражениях становится трудно отслеживать номера групп. Есть два формата, которые помогают с этой проблемой. Оба они используют общий синтаксис для расширений регулярных выражений.

Символы, следующие сразу за '?' указывают, какое расширение используется, поэтому (?=foo) это положительный предпросмотр, а (?:foo) - группа без захвата, содержащая подвыражение foo.

Иногда требуется использовать группу для обозначения части регулярного выражения при этом содержимого группы в последствии получать не нужно. Для этого необходимо использовать группу без захвата: (?:...)где ... заменяется любым регулярным выражением.

>>> m = re.match("([abc])+", "abc")
>>> m.groups()
# ('c',)
>>> m = re.match("(?:[abc])+", "abc")
>>> m.groups()
# ()

За исключением того факта, что нельзя получить содержимое того, что соответствует группе (?:...), группа без захвата ведет себя точно так же, как простая группа c захватом. Можно поместить что-нибудь в эту группу и повторить ее при помощи метасимвола повторения, таким как '*' и вложить все это в другие группы с захватом или без захвата. Это особенно полезно при изменении существующего шаблона, так как вы можете добавлять новые группы без изменения нумерации всех остальных групп. Следует отметить, что нет различий в производительности при поиске между группами с захватом и без захвата. Ни одна форма записи не быстрее, чем другая.