Группа без захвата в Regex Python с примером
Что такое группа без захвата в регулярных выражениях Python?
Регулярные выражения в Python имеют два типа групп:
- Группы захвата
- Группы без захвата
Ранее вы узнали, как использовать группу захвата для извлечения информации из более крупного совпадения или повторного сопоставления предыдущей сопоставленной группы с использованием обратной ссылки.
Для этого вы создаете группу захвата и помещаете в круглые скобки шаблон (или правило), например:
(X)
Этот синтаксис фиксирует любое совпадение X внутри совпадения, чтобы вы могли получить к нему доступ через метод group() объекта Match.
Иногда вам может потребоваться создать группу, но не включать ее в группы соответствия. Для этого вы можете использовать группу без захвата со следующим синтаксисом:
(?:X)
Пример группы Python Regex без захвата
В следующем примере показано, как использовать группы захвата для захвата основных и второстепенных версий Python в строке «Python 3.10».
import re s = 'Python 3.10' pattern = '(\d+)\.(\d+)' match = re.search(pattern, s) # show the whole match print(match.group()) # show the groups for group in match.groups(): print(group)
Выход:
3.10 3 10
Следующий шаблон соответствует одной или нескольким цифрам, за которыми следует литеральная строка(.) и одна или несколько цифр:
(\d+)\.(\d+)
Имеет две группы захвата. Они фиксируют цифры до и после литерала(.):
3 10
Предположим, вы не хотите захватывать цифры перед буквальным символом(.), вы можете использовать группу без захвата следующим образом:
import re s = 'Python 3.10' pattern = '(?:\d+)\.(\d+)' match = re.search(pattern, s) # show the whole match print(match.group()) # show the groups for group in match.groups(): print(group)
Выход:
3.10 10
В этом примере мы используем группу без захвата для первой группы:
(?:\d+)
Чтобы захватить только второстепенную версию, вы можете в первую очередь игнорировать группу без захвата следующим образом:
import re s = 'Python 3.10' pattern = '\d+\.(\d+)' match = re.search(pattern, s) # show the whole match print(match.group()) # show the groups for group in match.groups(): print(group)
Выход:
3.10 10
Так почему же мы вообще используем группу без захвата? Главная причина использования группы без захвата — экономия памяти, поскольку механизму регулярных выражений не требуется хранить группы в буфере.