Модуль 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
Поддержать проект