← Назад к вопросам

В чем различия между re.search и re.match?

1.3 Junior🔥 141 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Различия между re.search и re.match

Основная разница

re.match() и re.search() — это две фундаментальные функции модуля re в Python для поиска паттернов в строках. Главное различие заключается в том, где они начинают поиск:

  • re.match() ищет паттерн только в начале строки
  • re.search() ищет паттерн в любом месте строки

Практические примеры

re.match — только начало строки

import re

# Паттерн совпадает в начале
result = re.match(r"Hello", "Hello World")
print(result)  # <re.Match object; span=(0, 5), match="Hello">

# Паттерн есть, но не в начале
result = re.match(r"World", "Hello World")
print(result)  # None

re.search — в любом месте

import re

# Паттерн совпадает в начале
result = re.search(r"Hello", "Hello World")
print(result)  # <re.Match object; span=(0, 5), match="Hello">

# Паттерн есть в конце — находит!
result = re.search(r"World", "Hello World")
print(result)  # <re.Match object; span=(6, 11), match="World">

Сравнительная таблица

Параметрre.match()re.search()
Поиск с началаДа, толькоНет, с любого места
Поиск в серединеНетДа
Поиск в концеНетДа
ПроизводительностьБыстрееНемного медленнее
Типичное использованиеВалидация форматаПоиск подстроки

Эквивалентность с якорями

Технически re.match() эквивалентен re.search() с якорем ^ в начале:

# Эти три варианта работают одинаково:
re.match(r"pattern", string)
re.search(r"^pattern", string)
re.search(r"\\Apattern", string)  # \A — абсолютное начало строки

Когда что использовать

Используй re.match():

  • Валидация формата строки (номер телефона, почта в начале)
  • Проверка, начинается ли строка на определённый паттерн
  • Когда важна позиция совпадения в начале
# Проверяем, начинается ли URL с https
if re.match(r"https://", url):
    print("Защищённый URL")

Используй re.search():

  • Поиск паттерна в любом месте строки
  • Извлечение данных из текста
  • Когда не важна позиция совпадения
# Ищем номер телефона в тексте
text = "Позвоните мне по 89991234567 завтра"
match = re.search(r"\\d{10,11}", text)
if match:
    print(f"Найден номер: {match.group()}")

Общие ошибки

Неправильно — забыли, что match ищет только в начале:

if re.match(r"@", email):  # Всегда False для нормальной почты
    print("Valid email")

Правильно — используем search для поиска в любом месте:

if re.search(r"@", email):  # Ищет @ в любом месте
    print("Possible valid email")

Возвращаемое значение

Оба метода возвращают одно и то же:

  • Match объект — если паттерн найден
  • None — если паттерн не найден
match = re.match(r"\\d+", "123abc")
if match:
    print(match.group())    # "123"
    print(match.span())     # (0, 3)
    print(match.start())    # 0
    print(match.end())      # 3

Производительность

re.match() немного быстрее, так как начинает поиск с начала и может завершиться раньше. Но разница критична только для очень больших строк. Выбирай по функциональности, а не по производительности.

В чем различия между re.search и re.match? | PrepBro