Объект сопоставления Match
регулярного выражения со строкой всегда имеет логическое значение True
.
Так как функции re.match()
и re.search()
возвращают None
когда нет совпадений, то можно проверить, было ли совпадение, с помощью простого утверждения if...else
:
import re match = re.search(pattern, string) if match: process(match)
Match
: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
равен нулю, то соответствующее возвращаемое значение является всей соответствующей строкой; 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'