Группа без захвата в 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

Так почему же мы вообще используем группу без захвата? Главная причина использования группы без захвата — экономия памяти, поскольку механизму регулярных выражений не требуется хранить группы в буфере.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *