В чем разница между функциями `re.search()` и `re.match()` в Python?

Ответ

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

  • re.match(pattern, string): Ищет совпадение только в начале строки. Если шаблон не совпадает с началом строки, функция немедленно возвращает None.
    • Применение: Идеально подходит для проверки, начинается ли строка с определенного шаблона, например, для валидации формата префикса.
  • re.search(pattern, string): Ищет первое совпадение с шаблоном по всей строке. Сканирует строку слева направо и возвращает первое найденное совпадение.
    • Применение: Используется для поиска подстроки, соответствующей шаблону, в любом месте строки.

Пример:

import re

text = "Python is awesome"

# re.match() ищет только в начале
match_is = re.match(r"is", text)
print(f"re.match('is', text): {match_is}") # None, так как 'is' не в начале

match_python = re.match(r"Python", text)
print(f"re.match('Python', text): {match_python}") # <re.Match object; span=(0, 6), match='Python'>

# re.search() ищет по всей строке
search_is = re.search(r"is", text)
print(f"re.search('is', text): {search_is}") # <re.Match object; span=(7, 9), match='is'>

search_awesome = re.search(r"awesome", text)
print(f"re.search('awesome', text): {search_awesome}") # <re.Match object; span=(10, 17), match='awesome'>

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

  • Используйте re.match(), когда вам нужно убедиться, что строка начинается с определенного шаблона.
  • Используйте re.search(), когда вам нужно найти первое вхождение шаблона в любом месте строки.

Ответ 18+ 🔞

А, слушай, смотри, вот этот модуль re в Питоне, там есть две функции, которые на первый взгляд как близнецы-братья, а на деле — хуй пойми кто. re.search() и re.match(). Обе ищут по регуляркам, но разница — пиздец, важная, блядь.

Вот в чём, сука, соль:

  • re.match(pattern, string): Этот упёртый мудак ищет совпадение строго в начале строки. Не понравилось ему начало — сразу None, иди нахуй. Всё, точка.
    • Зачем он нужен? Ну, например, проверить, а не начинается ли строка с какого-нибудь ебанного префикса вроде https://. Идеально.
  • re.search(pattern, string): А этот — хитрая жопа. Он прочёсывает всю строку от начала до конца и хватает первое, что подходит под маску.
    • Зачем он нужен? Когда тебе похуй, где именно в тексте эта хрень засела, лишь бы нашлась. Нашёл — и доволен.

Смотри, на примере, чтоб вообще ни хуя не осталось непонятного:

import re

text = "Python is awesome"

# re.match() — упёртый в начало
match_is = re.match(r"is", text)
print(f"re.match('is', text): {match_is}") # None, потому что 'is' не в начале, ёпта!

match_python = re.match(r"Python", text)
print(f"re.match('Python', text): {match_python}") # Вот, нашёл! Объект match, span=(0, 6)

# re.search() — проныра, ищет везде
search_is = re.search(r"is", text)
print(f"re.search('is', text): {search_is}") # Ага, вот он где, сука! span=(7, 9)

search_awesome = re.search(r"awesome", text)
print(f"re.search('awesome', text): {search_awesome}") # И это тоже, span=(10, 17)

Итог, блядь, простой:

  • Хочешь проверить начало строки — тыкай в re.match(). Он строгий, как тёща.
  • Нужно найти хоть что-нибудь похожее в любом месте — бери re.search(). Он найдёт, даже если придётся перерыть всё, в рот меня чих-пых.