Функция re.match()
проверяет совпадение регулярного выражения всегда начиная с начала строки (то есть патерн должен учитывать совпадение с началом строки), в то время как функция re.search()
будет сканировать строку вперед на предмет первого совпадения с шаблоном. Важно держать это различие в виду. Помните, что функция re.match()
будет сообщать только об успешном совпадении, которое начнется с индекса строки 0
, если совпадение не начнется с нуля, результат функции re.match()
будет None
- совпадений НЕТ.
>>> re.match('super', 'superstition').span() # (0, 5) >>> print(re.match('super', 'insuperable')) # None
Функция re.search()
будет сканировать строку вперед, сообщая о ПЕРВОМ найденном совпадении.
>>> re.search('super', 'superstition').span() # (0, 5) >>> re.search('super', 'insuperable').span() # (2, 7)
Иногда кто-то будет испытывать искушение продолжать использовать re.match()
, просто добавив .*
к передней части регулярного выражения. Не надо так делать, вместо этого просто используйте re.search()
. Компилятор регулярных выражений выполняет некоторый анализ RegExp, чтобы ускорить процесс поиска соответствия. Один из таких анализов выясняет, каким должен быть первый символ совпадения. Например шаблон начинающийся с Crow
должен совпадать, начиная с символа 'C'
. Анализ позволяет механизму быстро сканировать строку в поисках начального символа, пробуя полное совпадение, только если найден символ 'C'
.
Добавление .*
устраняет эту оптимизацию, требуя сканирования до конца строки, а затем возврата, чтобы найти соответствие для остальной части регулярного выражения.