Регулярные выражения могут использовать много групп, как для сбора интересующих подстрок, так и для группировки и структурирования самого регулярного выражения. В сложных выражениях становится трудно отслеживать номера групп. Есть два формата, которые помогают с этой проблемой. Оба они используют общий синтаксис для расширений регулярных выражений.
Символы, следующие сразу за '?'
указывают, какое расширение используется, поэтому (?=foo)
это положительный предпросмотр, а (?:foo)
- группа без захвата, содержащая подвыражение foo
.
Иногда требуется использовать группу для обозначения части регулярного выражения при этом содержимого группы в последствии получать не нужно. Для этого необходимо использовать группу без захвата: (?:...)
где ...
заменяется любым регулярным выражением.
>>> m = re.match("([abc])+", "abc") >>> m.groups() # ('c',) >>> m = re.match("(?:[abc])+", "abc") >>> m.groups() # ()
За исключением того факта, что нельзя получить содержимое того, что соответствует группе (?:...)
, группа без захвата ведет себя точно так же, как простая группа c захватом. Можно поместить что-нибудь в эту группу и повторить ее при помощи метасимвола повторения, таким как '*'
и вложить все это в другие группы с захватом или без захвата. Это особенно полезно при изменении существующего шаблона, так как вы можете добавлять новые группы без изменения нумерации всех остальных групп. Следует отметить, что нет различий в производительности при поиске между группами с захватом и без захвата. Ни одна форма записи не быстрее, чем другая.