Модуль re: search, match, fullmatch и объект Match
Разбираем три способа применить паттерн к строке и учимся читать результат поиска.
Объект Match — то, что возвращает удачный поиск: в нём лежат сам найденный текст и его позиция в строке.
Три функции поиска
В модуле re есть три похожие, но разные функции:
re.search(pattern, text)— ищет паттерн в любом месте строки, возвращает первое совпадение.re.match(pattern, text)— проверяет, начинается ли строка с паттерна (привязка к началу).re.fullmatch(pattern, text)— требует, чтобы паттерн совпал со всей строкой целиком.
Все три возвращают объект Match при успехе и None, если совпадения нет.
import re
print(re.search(r"\d+", "abc123")) # цифры есть в середине
print(re.match(r"\d+", "abc123")) # но строка не НАЧИНАЕТСЯ с цифр
print(re.match(r"\d+", "123abc")) # а здесь начинается
print(re.fullmatch(r"\d+", "123abc")) # вся строка — не только цифры
print(re.fullmatch(r"\d+", "123")) # а тут вся строка из цифр
Вывод:
<re.Match object; span=(3, 6), match='123'> None <re.Match object; span=(0, 3), match='123'> None <re.Match object; span=(0, 3), match='123'>
Видно разницу: search нашёл цифры в середине, match требует начало строки, а fullmatch — полное совпадение. Для валидации формата почти всегда нужен fullmatch: «строка целиком должна быть телефоном», а не «где-то внутри есть похожее».
Объект Match: что внутри
Результат поиска — не просто строка, а объект с методами:
m.group()— найденный текст.m.start()иm.end()— индексы начала и конца в исходной строке.m.span()— кортеж(start, end).
import re
m = re.search(r"\d+", "Цена: 4990 рублей")
print(m.group())
print(m.start(), m.end())
print(m.span())
Вывод:
4990 6 10 (6, 10)
Срез "Цена: 4990 рублей"[6:10] как раз даёт "4990" — позиции точные.
Главная ловушка: проверка на None
Если совпадения нет, функция вернёт None, и вызов .group() на None уронит программу с AttributeError. Поэтому результат всегда проверяют:
import re
m = re.search(r"\d+", "тут нет чисел")
if m:
print("Нашли:", m.group())
else:
print("Совпадений нет")
Вывод:
Совпадений нет
Итог
searchищет где угодно,match— от начала,fullmatch— по всей строке.- Для проверки формата берите
fullmatch. - Объект
Matchхранит текст (group()) и позицию (start,end,span). - При неудаче возвращается
None— всегда проверяйте результат перед.group().
Проверьте себя
1. Чем re.match отличается от re.search?
Amatch ищет везде, а search — только в начале
Bmatch проверяет начало строки, а search ищет в любом месте
CОни полностью идентичны
Dmatch работает только с цифрами
2. Какую функцию выбрать, чтобы проверить, что ВСЯ строка целиком — это телефон?
Are.search
Bre.match
Cre.fullmatch
Dre.find
3. Что вернёт re.search, если совпадения нет?
AПустую строку ""
BNone
CОшибку ValueError
DПустой объект Match