В предыдущих подразделах были рассмотрены способы загрузки и структурирования данных из файлов. Однако в аналитической практике далеко не вся информация представлена в виде таблиц. Часто данные имеют текстовую форму и не обладают строгой структурой. В таких случаях возникает необходимость извлечения отдельных фрагментов текста по заданным правилам. Для решения этой задачи используются регулярные выражения – инструмент формального описания текстовых шаблонов.
В разделе 2.2 было показано, что данные часто поступают в виде текстовых файлов. Однако во многих практических задачах текст не имеет строгой табличной структуры. Примеры:
· журналы событий (логи);
· выгрузки сообщений;
· текстовые отчёты;
· строки с переменным форматом;
· данные, полученные через API;
· неструктурированные поля в CSV-файлах.
В таких случаях возникает задача: найти в тексте определённые фрагменты по заданному шаблону.
Что такое регулярное выражение. Регулярное выражение – это формальный шаблон, описывающий множество строк. Иначе говоря, регулярное выражение – это правило поиска текста по заданной структуре. Например,
· найти все числа в тексте;
·
найти
даты формата 12.05.2025;
· извлечь адрес электронной почты;
· выделить идентификатор из строки журнала.
Почему обычного поиска строки недостаточно. Обычный поиск: text.find("2026") позволяет найти только точное совпадение. Однако если требуется:
· найти любую дату;
· найти любое число;
· найти любую последовательность букв и цифр
– тогда нужен не конкретный текст, а описание структуры. Именно это делает регулярное выражение.
Пример практической задачи. Пусть имеется строка:
ID: 4587; Date: 12.05.2026; User: Ivan
Аналитику может потребоваться:
· извлечь числовой идентификатор;
· выделить дату;
· получить имя пользователя.
Структура строки известна, но значения могут меняться. Регулярное выражение позволяет описать:
· последовательность цифр;
· шаблон даты;
· последовательность букв.
Регулярные
выражения в Python. В
Python
работа с регулярными выражениями осуществляется с помощью стандартного модуля re. Подключение
модуля:
import re
Далее используются специальные функции поиска и обработки текста. Подробное рассмотрение функций будет представлено в следующем подразделе.
Методический акцент. Необходимо понимать, что регулярные выражения – это инструмент перехода от неструктурированного текста к структурированным данным. Они позволяют:
· извлекать значения из произвольных строк;
· очищать текст;
· проверять корректность формата данных;
· подготавливать текст к дальнейшему анализу.
Таким образом, если:
· в разделе 2.2 данные были загружены из файлов,
· в разделе 2.3 они анализируются на уровне текстовой структуры,
то регулярные выражения выполняют роль промежуточного этапа между текстом и числовой или табличной обработкой (разделы 2.4 и 2.5).
Регулярное
выражение – это формальный шаблон для поиска фрагментов текста. Шаблон строится
из специальных символов и правил их комбинирования. Понимание синтаксиса
является обязательным условием корректного применения функций модуля re.
Если в шаблоне указан обычный символ, он ищется буквально. Пример:
re.search("data", "big data analysis")
Совпадение
произойдёт, если в строке встречается последовательность символов data.
2. Специальные символьные классы
Эти конструкции обозначают группы символов (Таблица 2.4.1).
Таблица 2.4.1 – Основные символьные классы
|
Обозначение |
Значение |
|
|
Любая цифра (0–9) |
|
|
Любой символ, кроме цифры |
|
|
Буква, цифра или подчёркивание |
|
|
Любой небуквенно-цифровой символ |
|
|
Пробельный символ (пробел, табуляция, перенос строки) |
|
|
Любой непробельный символ |
Пример:
r"\d+"
означает
– одна или более цифр подряд. Префикс r указывает на «сырую строку», что предотвращает интерпретацию
\ как управляющего символа Python.
3. Квантификаторы (повторения)
Квантификаторы указывают, сколько раз должен повторяться элемент (таблица 2.4.2).
Таблица 2.4.2 – Основные квантификаторы
|
Символ |
Значение |
|
|
0 и более повторений |
|
|
1 и более повторений |
|
|
0 или 1 повторение |
|
|
Ровно n повторений |
|
|
От n до m повторений |
Пример:
\d+ – одна или более цифр.
\w{3} – ровно три символа.
4. Квадратные скобки – набор допустимых символов
Квадратные скобки задают множество символов, из которых выбирается один. Примеры:
[abc] – символ a, b или c.
[0-9] – любая цифра.
[A-Z] – любая заглавная латинская буква.
Можно задавать и диапазоны.
5. Отрицание в квадратных скобках
Если
внутри скобок первым символом стоит ^, выбираются все символы, кроме
указанных. Пример:
[^0-9] – любой символ, кроме цифры.
Важно, что в этом случае ^ означает отрицание, а не начало
строки.
Круглые скобки используются для объединения фрагментов шаблона. Пример,
(abc)+
означает
повторение последовательности abc.
Группы
также используются для извлечения фрагментов текста, что будет рассмотрено
далее при изучении .group().
7. Специальные управляющие символы
Некоторые символы имеют специальное значение (таблица 2.4.3).
Таблица 2.4.3 – Управляющие символы
|
Символ |
Значение |
|
|
Любой символ (кроме перевода строки) |
|
|
Начало строки |
|
|
Конец строки |
Пример:
^\d+ – строка начинается с цифр
\d+$ – строка заканчивается
цифрами
Методический акцент. Регулярное выражение – это не функция Python. Это формальный язык описания текстовых шаблонов. Функции модуля re лишь применяют этот шаблон к строке. Необходимо понимать:
· шаблон описывает структуру текста;
· корректность результата полностью зависит от правильности шаблона;
·
одна и та же функция re.search()
может давать разные результаты при изменении шаблона.
Именно синтаксис регулярного выражения определяет аналитический смысл поиска. В следующем подразделе будет показано, как функции модуля re используют эти шаблоны для поиска, извлечения и замены текста.
re и базовые функции поискаПосле
изучения базовых элементов синтаксиса регулярных выражений необходимо
рассмотреть инструменты их применения в Python. Для работы с регулярными выражениями используется
стандартный модуль re (regular expressions).
Регулярное выражение само по себе является шаблоном. Функции модуля re применяют этот шаблон к строке и
выполняют операции поиска или преобразования. Подключение модуля re:
importre
1. Классификация основных функций
Функции
модуля re можно разделить по
назначению (таблица 2.4.4).
Таблица
2.4.4– Классификация базовых функций модуля re
|
Группа |
Функция |
Назначение |
|
Поиск одного совпадения |
|
Ищет первое совпадение в строке |
|
Поиск всех совпадений |
|
Возвращает список всех совпадений |
|
Проверка начала строки |
|
Проверяет совпадение только в начале строки |
|
Замена текста |
|
Заменяет найденные фрагменты |
2. Сравнение поведения функций
Сравнение поведения функций представлены в таблице 2.4.5.
Таблица 2.4.5 – Сравнение поведения функций
|
Функция |
Где выполняется поиск |
Количество совпадений |
Тип результата |
|
|
Вся строка |
Первое |
Объект совпадения |
|
|
Вся строка |
Все |
Список строк |
|
|
Только начало строки |
Первое |
Объект совпадения |
|
|
Вся строка |
Все |
Новая строка |
3. Мини-примеры для понимания различий
search()
– первое совпадение
Функция search() просматривает
всю строку и возвращает первое совпадение с заданным шаблоном.
import re text = "ID: 4587; Code: 77; Date: 12.05.2023; Score: 95" result = re.search(r"\d+", text) (result.group())
Результат:
4587
Назначение
функции search():
· выполняет поиск слева направо;
· останавливается при первом совпадении;
· возвращает объект совпадения (Match object).
Метод
.group() используется для получения
найденного текстового фрагмента. Если совпадение отсутствует, возвращается None.
findall()
– все совпадения
Функция
findall() используется
для извлечения всех фрагментов строки, соответствующих шаблону.
import re text = "Числа: 10, 25 и 37" numbers = re.findall(r"\d+", text) print(numbers)
Результат: ['10', '25', '37']
Особенности
функции findall():
· строка просматривается полностью;
· возвращается список всех совпадений;
·
элементы
списка имеют тип str.
Для дальнейших вычислений требуется явное преобразование типов:
numbers = [int(n) for n in numbers]
match()
– проверка начала строки
Функция
match() проверяет соответствие
шаблону только в начале строки.
import re text = "123abc" result = re.match(r"\d+", text) (result.group())
Результат:
123
Если строка не начинается с цифр:
text = "abc123" result = re.match(r"\d+", text) (result)
Результат: None
Функция match() применяется при:
· проверке формата данных;
· валидации входных строк;
· контроле структуры текстовых записей.
sub() –
замена фрагментов
Функция
sub() выполняет замену всех
совпадений шаблона.
import re text = "Телефон: 123-456-789"masked = re.sub(r"\d", "*", text) (masked)
Результат:
Телефон:
***-***-***
Назначение
функции sub():
· просматривает строку полностью;
· заменяет каждое совпадение;
· возвращает новую строку.
Исходная строка при этом не изменяется.
Таким
образом, если search() и findall() используются для извлечения
информации, то sub()
применяется для преобразования текста.
Методический
акцент. Регулярное
выражение описывает структуру текста, а функции модуля re
реализуют операции: поиск, извлечение, проверку, преобразование текста. В
задачах анализа данных регулярные выражения применяются:
· при очистке текстовых данных;
· при извлечении числовых показателей;
· при проверке формата записей;
· при подготовке данных к дальнейшей обработке.
В следующем подразделе будут рассмотрены типовые аналитические задачи, решаемых с использованием регулярных выражений.