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

Объект совпадения с шаблоном Match модуля re в Python

Объект совпадения с шаблоном регулярного выражения

Объект сопоставления Match регулярного выражения со строкой всегда имеет логическое значение True.

Так как функции re.match() и re.search() возвращают None когда нет совпадений, то можно проверить, было ли совпадение, с помощью простого утверждения if...else:

import re

match = re.search(pattern, string)
if match:
    process(match)

Методы объекта сопоставления шаблона со строкой Match:

  • Строка c содержимым найденной группы Match.expand(),
  • Одна или несколько подгрупп совпадения Match.group(),
  • Идентичен Match.group() Match.__getitem__(),
  • Кортеж, содержащий все подгруппы совпадения Match.groups(),
  • Словарь, содержащий все совпавшие именованные подгруппы Match.groupdict(),
  • Индексы начала и конца подстроки совпадающей с группой Match.start() и Match.end(),
  • Двойной кортеж вида (m.start(), m.end()) Match.span(),
  • Индекс вхождения в строку начала совпадения Match.pos,
  • Индекс вхождения в строку конца совпадения Match.endpos,
  • Индекс последней найденной группы захвата Match.lastindex,
  • Имя последней соответствующей группы захвата Match.lastgroup,
  • Объект регулярного выражения Match.re,
  • Строка, в которой осуществляется поиск Match.string.

Match.expand(template):

Метод Match.expand() возвращает строку c содержимым группы template, которая была определена в шаблоне регулярного выражения, как это делает метод re.sub().

Экранированные символы, такие как \n, преобразуются в соответствующие символы, а числовые обратные ссылки (\1, \2) и именованные обратные ссылки (\g<1>, \g<name>) заменяются содержимым соответствующей группы.

# Метод `Match.expand()`
>>> re.search(r'w(.*)m', 'awesome').expand(r'\1')
'[eso]'

>>> re.sub(r'w(.*)m', r'[\1]', 'awesome')
'a[eso]e'

Match.group([group1, ...]):

Метод Match.group() возвращает одну или несколько подгрупп совпадения. При наличии одного аргумента результатом будет одна строка, при наличии нескольких аргументов результатом будет кортеж с одним элементом на аргумент. Без аргументов группа 1 по умолчанию равна нулю - возвращается все совпадение.

  • Если аргумент groupN равен нулю, то соответствующее возвращаемое значение является всей соответствующей строкой;
  • Если номер группы находится в инклюзивном диапазоне [1..99], это строка, соответствующая соответствующей группе скобок.
  • Если номер группы отрицателен или больше, чем число групп, определенных в шаблоне, возникает исключение IndexError.
  • Если группа содержится в части шаблона, которая не соответствует, то соответствующий результат - None.
  • Если группа содержится в части шаблона, которая совпала несколько раз, возвращается последнее совпадение.
>>> import re
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")

# Совпадение со всем шаблоном
>>> m.group(0)
# 'Isaac Newton'

# Первая группа
>>> m.group(1)
# 'Isaac'

# Вторая группа
>>> m.group(2)
# 'Newton'

# Можно указывать несколько групп
>>> m.group(1, 2)
# ('Isaac', 'Newton')

Если регулярное выражение использует синтаксис (?P<name>...), аргументы groupN также могут быть строками, идентифицирующими группы по имени группы. Если строковый аргумент не используется в качестве имени группы в шаблоне регулярного выражения, возникает исключение IndexError.

Умеренно сложный пример:

>>> import re
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.group('first_name')
# 'Malcolm'
>>> m.group('last_name')
# 'Reynolds'

На именованные группы также можно ссылаться по их индексу:

>>> m.group(1)
# 'Malcolm'
>>> m.group(2)
# 'Reynolds'

Если группа совпадает несколько раз, доступно только последнее совпадение:

>>> import re
>>> m = re.match(r"(..)+", "a1b2c3")

# 3 совпадения шаблона со строкой
>>> m.group()
# 'a1b2c3'

# для извлечения доступно только последнее
>>> m.group(1)
# 'c3'

Match.__getitem__(g):

Метод Match.__getitem__() идентичен m.group(g), что позволяет легче получить доступ к отдельной группе из объекта сопоставления:

>>> import re
>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")

# полное совпадение
>>> m[0]
'Isaac Newton'

# Первая заключенная в скобки подгруппа.
>>> m[1]
# 'Isaac'

# Вторая заключенная в скобки подгруппа.
>>> m[2]
# 'Newton'

Match.groups(default=None):

Метод Match.groups() вернет кортеж, содержащий все подгруппы совпадения, от 1 до любого количества групп в шаблоне. Аргумент default используется для групп, которые не смогли захватить какой либо результат при сканировании строки и по умолчанию будут равны None.

>>> import re
>>> m = re.match(r"(\d+)\.(\d+)", "24.1632")
>>> m.groups()
# ('24', '1632')

Если сделать десятичную точку и все, что после нее необязательным, то не все группы получат результат захвата. Эти группы по умолчанию будут иметь значение None:

>>> import re
>>> m = re.match(r"(\d+)\.?(\d+)?", "24")

# 2 группа по умолчанию None.
>>> m.groups()
# ('24', None)

# теперь 2 группа по умолчанию '0'.
>>> m.groups('0')
# ('24', '0')

Match.groupdict(default=None):

Метод Match.groupdict() возвращает словарь, содержащий все именованные подгруппы совпадения, помеченные именем подгруппы name. Аргумент default используется для групп, которые не смогли захватить какой либо результат при сканировании строки и по умолчанию будут равны None.

>>> import re
>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.groupdict()
# {'first_name': 'Malcolm', 'last_name': 'Reynolds'}

Match.start([group]),
Match.end([group])
:

Методы возвращают индексы начала и конца подстроки совпадающей с группой group. По умолчанию группа group равна нулю, имеется в виду вся совпадающая подстрока. Методы возвращают -1, если группа существует, но не смогла захватить какой либо результат. Для объекта сопоставления m и группы g, которая внесла свой вклад в сопоставление, подстрока, сопоставленная группе g эквивалентная m.group(g), является:

>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.string[m.start(1):m.end(1)]
# 'Malcolm'

Обратите внимание, что m.start(group) будет равно m.end(group), если группа соответствует нулевой строке. Например после выполнения m = re.search('b(c?)', 'cba'), m.start(0) будет равно 1, m.end(0) это 2. m.start(1) и m.end(1) равны 2, а m.start(2) вызывает исключение IndexError.

Пример, который удалит remove_this из адресов электронной почты:

>>> email = "tony@tiremove_thisger.net"
>>> m = re.search("remove_this", email)
>>> email[:m.start()] + email[m.end():]
# 'tony@tiger.net'

Match.span([group]):

Метод Match.span() вернет двойной кортеж вида (m.start(group), m.end(group)). Обратите внимание, что если группа не внесла свой вклад в совпадение, то результатом будет кортеж (-1, -1). По умолчанию группа group равна нулю, имеется в виду вся совпадающая подстрока.

>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.span(1)
# (0, 7)

Атрибуты объекта сопоставления Match:

Match.pos:

Атрибут Match.pos это значение pos, которое было передано в методы Pattern.search() или Pattern.match() объекта регулярного выражения. Это индекс вхождения в строку, в которой механизм регулярного выражения начал поиск совпадения.

Match.endpos:

Атрибут Match.endpos это значение endpos, которое было передано в методы Pattern.search() или Pattern.match() объекта регулярного выражения. Это индекс вхождения в строку, дальше которой механизм регулярного выражения не пойдет.

Match.lastindex:

Атрибут Match.lastindex это целочисленный индекс последней найденной группы захвата или None, если ни одна группа не была найдена вообще. Например, выражения (a) b, ((a) (b)) и ((ab)) будут иметь lastindex == 1, если их применять к строке 'ab', тогда как выражение (a) (b) будет иметь lastindex == 2, если применяется к той же строке.

>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.lastindex
# 2

Match.lastgroup:

Атрибут Match.lastgroup это имя последней соответствующей группы захвата или None, если у группы не было имени, или если ни одна группа не была сопоставлена вообще.

>>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
>>> m.lastgroup
# 'last_name'

Match.re:

Атрибут Match.re это объект регулярного выражения метода Pattern.match() или Pattern.search(), который создал этот экземпляр соответствия.

>>> email = "tony@tiremove_thisger.net"
>>> m = re.search("remove_this", email)
>>> m.re
# re.compile('remove_this')

Match.string:

Атрибут Match.string это строка, переданная в Pattern.match() или Pattern.search() в которой осуществляется поиск соответствий с регулярным выражением.

>>> email = "tony@tiremove_thisger.net"
>>> m = re.search("remove_this", email)
>>> m.string
'tony@tiremove_thisger.net'