Re.search: примеры (PYTHON)

Функция 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() остаётся без изменений в поведении.

Расширенные примеры

Поиск с именованными группами:

Пример python
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:

Пример python
text = 'Строка 1\nСтрока 2'
result = re.search(r'Строка 1.*Строка 2', text, re.DOTALL)
print(bool(result))
True

Поиск с условными выражениями:

Пример python
# Поиск слова 'цвет' или 'цвета'
text = 'Разные цвета'
result = re.search(r'цвет(?:а)?', text)
print(result.group())
цвета

Использование позиционных параметров в Match:

Пример python
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 результат - массив.

питон re.search function comments

En
Re.search Search pattern in string