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

match() VS search().

Функция match() против функции search().

Функция re.match() проверяет совпадение регулярного выражения только в начале строки, в то время как функция re.search() будет сканировать строку вперед на предмет первого совпадения с шаблоном. Важно держать это различие в виду. Помните, что функция re.match() будет сообщать только об успешном совпадении, которое начнется с индекса строки 0, если совпадение не начнется с нуля, результат функции re.match() будет None - совпадений НЕТ.

>>> print(re.match('super', 'superstition').span())
# (0, 5)
>>> print(re.match('super', 'insuperable'))
# None

Функция re.search() будет сканировать строку вперед, сообщая о ПЕРВОМ найденном совпадении.

>>> print(re.search('super', 'superstition').span())
# (0, 5)
>>> print(re.search('super', 'insuperable'))
# (2, 7)

Иногда кто-то будет испытывать искушение продолжать использовать re.match(), просто добавив .* к передней части регулярного выражения. Не надо так делать, вместо этого просто используйте re.search(). Компилятор регулярных выражений выполняет некоторый анализ RegExp, чтобы ускорить процесс поиска соответствия. Один из таких анализов выясняет, каким должен быть первый символ совпадения. Например шаблон начинающийся с Crow должен совпадать, начиная с символа 'C'. Анализ позволяет механизму быстро сканировать строку в поисках начального символа, пробуя полное совпадение, только если найден символ 'C'.

Добавление .* устраняет эту оптимизацию, требуя сканирования до конца строки, а затем возврата, чтобы найти соответствие для остальной части регулярного выражения.