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