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

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

Скомпилированные объекты регулярных выражений re.compile('pattern') поддерживают несколько методов и атрибутов. Здесь будут рассмотрены только самые важные из них. Полный список методов и атрибутов с их описанием смотрите в разделе "Атрибуты и методы cкомпилированного объекта регулярного выражения".

  • match() - Определяет соответствие шаблону RegExp в начале строки.
  • search() - Сканирует всю строку и ищет все соответствия шаблону RegExp соответствует.
  • findall() - Находит все подстроки, где шаблон RegExp совпадает, и вернуть их в виде списка.
  • finditer() - Находит все подстроки, где шаблон RegExp совпадает, и вернуть их в качестве итератора .

Методы скомпилированного объекта match() и search() возвращают None, если совпадение не найдено. Если совпадение найдено, возвращается экземпляр объекта match, содержащий информацию о совпадении: где оно начинается и заканчивается, подстрока, которой оно соответствует, и многое другое.

Если установлен модуль |tkinter| то можно интерактивно экспериментировать с модулем re и запустить демонстрационную программу, которая включена в дистрибутив Python. Она может быть полезна при отладке сложных шаблонов регулярных выражений.

Запустим интерпретатор Python, импортируем модуль re и скомпилируем шаблон регулярного выражения:

>>> import re
>>> p = re.compile('[a-z]+')
>>> p
# re.compile('[a-z]+')

Теперь можно попробовать сопоставить различные строки с регулярным выражением [a-z]+. Пустая строка не должна совпадать вообще, поскольку '+' означает одно или несколько повторений. В этом случае метод match() должен вернуть None и интерпретатор ничего не напечатает. Так же можно явно распечатать результат метода match().

>>> p.match("")
>>> print(p.match(""))
# None

Теперь попробуем подставить строку, которая должна соответствовать скомпилированному шаблону, например tempo. В этом случае методом match() будет возвращен соответствующий объект, который нужно сохранить в переменной для дальнейшего использования.

>>> m = p.match('tempo')
>>> m  
# <_sre.SRE_Match object; span=(0, 5), match='tempo'>

Запросим объект для получения информации о соответствующей строке. Экземпляры объекта match() также имеют несколько методов и атрибутов. Самые важные из них:

  • group() - Вернет строку, совпадающую с регулярным выражением.
  • start() - Вернет индекс строки начала совпадения.
  • end() - Вернет индекс строки конца совпадения.
  • span() - Вернет кортеж, содержащий индексы (start, end) позиции совпадения.
>>> m.group()
# 'tempo'
>>> m.start(), m.end()
# (0, 5)
>>> m.span()
# (0, 5)

Поскольку метод match() проверяет только совпадает ли выражение в начале строки, то следовательно start() всегда будет 0. Метод search() сканирует всю строку и заканчивает работу при первом совпадении, поэтому в этом случае совпадение может не начинаться с нуля.

>>> print(p.match('::: message'))
None
>>> m = p.search('::: message'); print(m)  
<_sre.SRE_Match object; span=(4, 11), match='message'>
>>> m.group()
'message'
>>> m.span()
(4, 11)

В реальных программах наиболее распространенным стилем является сохранение объекта Match в переменной, а затем проверка его наличия None. Это обычно выглядит так:

p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
    print('Match found: ', m.group())
else:
    print('No match')

Метод findall() возвращает список всех совпадающих подстрок:

>>> p = re.compile('\d+')
>>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
# ['12', '11', '10']

Метод findall() создает весь список совпадающих подстрок, прежде чем он возвращает их в качестве результата. Метод finditer() возвращает последовательность объектов совпадений в качестве итератора :

>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator  
# <callable_iterator object at 0x...>
>>> for match in iterator:
...     print(match.span())
...
# (0, 2)
# (22, 24)
# (29, 31)