Скомпилированные объекты регулярных выражений 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)