← Назад к вопросам
В чем различия между 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() немного быстрее, так как начинает поиск с начала и может завершиться раньше. Но разница критична только для очень больших строк. Выбирай по функциональности, а не по производительности.