Re.search: примеры (PYTHON)
re.search(pattern, string, flags): re.Match or NoneФункция re.search в Python
Функция re.search() из модуля re выполняет поиск первого совпадения с регулярным выражением в строке. В отличие от re.match(), которая ищет только в начале строки, re.search() проверяет всю строку.
Основное применение функции - извлечение данных, валидация текста, поиск паттернов в логах или документах.
Аргументы:
pattern- строка или скомпилированное регулярное выражение.string- строка, в которой выполняется поиск.flags- модификаторы (например,re.IGNORECASE).
Возвращаемое значение:
- Объект
Matchпри успешном поиске. None, если совпадение не найдено.
Объект Match содержит информацию о совпадении: позиции, группы, сам текст совпадения.
Примеры использования re.search
Базовый пример поиска цифр в строке:
import re
text = 'Заказ №12345 от 12.03.2024'
result = re.search(r'№(\d+)', text)
print(result.group(1))12345
Использование флага re.IGNORECASE:
result = re.search(r'python', 'Язык Python', re.IGNORECASE)
print(result.group())Python
Поиск с несколькими группами:
text = 'Имя: Иван, возраст: 30'
result = re.search(r'Имя: (\w+), возраст: (\d+)', text)
if result:
print(f'Имя: {result.group(1)}, возраст: {result.group(2)}')Имя: Иван, возраст: 30
Альтернативные функции в Python
re.match()- ищет совпадение только в начале строки.re.fullmatch()- проверяет полное соответствие строки шаблону.re.findall()- возвращает все непересекающиеся совпадения в виде списка.re.finditer()- возвращает итератор с объектами Match.
re.match() применяют для строгой проверки начала строки, re.findall() - для извлечения всех вхождений. Функция re.search() оптимальна для поиска первого вхождения в любом месте строки.
Типичные ошибки
1. Отсутствие обработки None при неудачном поиске:
result = re.search(r'\d{10}', 'Нет телефона')
print(result.group()) # ОшибкаAttributeError: 'NoneType' object has no attribute 'group'
2. Использование re.search() для проверки полного совпадения:
# Неправильно для проверки целой строки
if re.search(r'\d+', '123abc'):
print('Найдено') # Сработает, хотя строка содержит не только цифрыНайдено
3. Неэкранированные спецсимволы в паттерне:
re.search(r'(test)', 'test') # Правильно
re.search(r'(test', 'test') # Ошибка: незакрытая скобкаerror: missing ), unterminated subpattern
Изменения в последних версиях
В Python 3.11 добавлена поддержка re.Pattern и re.Match как генериков для аннотаций типов. С Python 3.6 строковые литералы в паттернах разрешено использовать как f-строки.
Начиная с Python 3.7, пустые совпадения для разделителей в re.split() вызывают предупреждение, но re.search() остаётся без изменений в поведении.
Расширенные примеры
Поиск с именованными группами:
text = 'Дата: 2024-03-12'
pattern = r'(?P\d{4})-(?P\d{2})-(?P\d{2})'
result = re.search(pattern, text)
if result:
print(f'Год: {result.group("year")}, месяц: {result.group("month")}') Год: 2024, месяц: 03
Использование флага re.DOTALL:
text = 'Строка 1\nСтрока 2'
result = re.search(r'Строка 1.*Строка 2', text, re.DOTALL)
print(bool(result))True
Поиск с условными выражениями:
# Поиск слова 'цвет' или 'цвета'
text = 'Разные цвета'
result = re.search(r'цвет(?:а)?', text)
print(result.group())цвета
Использование позиционных параметров в Match:
text = 'A123B456'
result = re.search(r'(\d+).*(\d+)', text)
print(f'Начало: {result.start()}, конец: {result.end()}')
print(f'Все группы: {result.groups()}')Начало: 1, конец: 8
Все группы: ('123', '456')Аналоги в других языках
PHP: preg_match() - возвращает 1 при совпадении.
$text = 'Пример 123';
if (preg_match('/\\d+/', $text, $matches)) {
echo $matches[0];
}123
JavaScript: String.prototype.match() или RegExp.prototype.exec().
const text = 'Пример 123';
const result = text.match(/\d+/);
console.log(result[0]);123
Java: Matcher.find() из пакета java.util.regex.
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("Пример 123");
if (matcher.find()) {
System.out.println(matcher.group());
}123
Основное отличие Python - возврат объекта Match с детальной информацией. В JavaScript и PHP результат - массив.