В аналитической практике регулярные выражения применяются не абстрактно, а для решения конкретных задач обработки текстовых данных: очистки полей, извлечения показателей, проверки формата записей и фильтрации журналов событий. К типичным задачам относятся:
· очистка текстовых полей;
· извлечение числовых значений;
· выделение дат;
· проверка формата записей;
· маскирование персональных данных;
· фильтрация логов и журналов событий.
Рассмотрим наиболее характерные примеры.
1. Извлечение числовых значений из текста
Задача: из строки журнала событий извлечь числовые показатели (целые и вещественные).
importre
text= "Температура: 23.5C, давление: 760 мм, скорость: 15 км/ч"
numbers = re.findall(r"\d+\.?\d*", text) print(numbers)
Результат:
['23.5',
'760', '15']
Пояснение шаблона:
\d+ – одна или более цифр;
\.? – необязательная точка;
\d* – ноль или более цифр после точки.
Методический акцент. findall() возвращает строки. Если
значения далее участвуют в вычислениях, требуется преобразование типов,
например,
numbers = [float(x) for x in numbers]
Задача: найти даты формата дд.мм.гггг.
importre
text= "Отчёты сформированы 12.05.2026 и 01.06.2026"
dates = re.findall(r"\d{2}\.\d{2}\.\d{4}", text) print(dates)
Результат: ['12.05.2026', '01.06.2026']
Применение задачи извлечения дат:
· анализ журналов;
· обработка документов;
· подготовка временных рядов.
Методическое замечание. Приведённый шаблон проверяет
структуру даты, но не проверяет её корректность (например, 99.99.2026 будет найдено). Полная
проверка корректности даты выполняется дополнительной логикой (например, через datetime).
3. Очистка текста от лишних символов
Задача: удалить из строки все символы, кроме букв и цифр.
import re text = "User#123! Status: OK." cleaned = re.sub(r"[^\w\s]", "", text) print(cleaned)
Результат: User123 Status OK
Пояснение к коду:
[\w\s]
– допустимые символы (буквы/цифры/_
и пробельные);
^ внутри [] означает отрицание: «всё, кроме…»;
sub() удаляет найденные
символы (заменяет на пустую строку).
Методический акцент. Это типовая операция первичной очистки текстовых полей перед анализом: удаление служебных знаков, «шумных» символов, следов форматирования.
4. Проверка формата электронной почты
Задача: проверить, соответствует ли строка формату электронной почты.
import re email =user@example.com
pattern = r"^[\w\.-]+@[\w\.-]+\.\w+$"
if re.match(pattern, email):("Формат корректен")
else:
("Некорректный формат")
^[\w\.-]+@[\w\.-]+\.\w+$:
^ – начало строки (исключает
лишние символы перед email);
[\w\.-]+ – имя пользователя, состоящее из
букв, цифр, подчёркивания, точки или дефиса;
@ – обязательный разделитель;
[\w\.-]+ – доменное имя;
\. – точка перед доменной
зоной;
\w+ – доменная зона (например, com, ru, net);
$ – конец строки (исключает
лишние символы после email).
Методический акцент:
·
match()
уместен, так как используется контроль начала строки, а якоря ^
и $ требуют соответствия всей строки.
· Шаблон проверяет общую структуру, но не гарантирует полную корректность по стандартам (RFC).
В аналитических задачах такая проверка обычно достаточна для предварительной валидации данных.
5. Маскирование персональных данных
Задача: скрыть часть номера банковской карты, оставив последние 4 цифры:
importre
text= "Карта: 1234 5678 9012 3456"
# \d{4} – ровно четыре цифры
# \s– пробел
# Шаблон описывает первые три блока по 4 цифрыmasked = re.sub(r"\d{4}\s\d{4}\s\d{4}\s", "**** **** **** ", text) (masked)
Результат:
Карта:
**** **** **** 3456
\d{4}\s\d{4}\s\d{4}\s:
\d{4} – ровно четыре цифры подряд;
\s – пробел;
Конструкция
повторяется три раза и «захватывает» первые 12 цифр с пробелами. Таким образом,
шаблон находит первые 12 цифр номера карты вместе с пробелами и заменяет их
строкой "****
**** **** ". Последние четыре цифры остаются без изменения.
Методический акцент.
Функция sub():
· возвращает новую строку;
· не изменяет исходную переменную;
· заменяет все совпадения шаблона.
Маскирование применяется при:
· обезличивании персональных данных;
· подготовке данных для публикации;
· формировании логов без раскрытия конфиденциальной информации.
Задача: извлечь строки журнала,
содержащие код ошибки 500.
Код ошибки находится в середине строки:
import re logs = """INFO 200 OKERROR 500 Internal Server ErrorWARNING 404 Not FoundCRITICAL 500 Timeout"""errors = re.findall(r"500.*", logs) print(errors)
Результат: ['500 Internal Server Error', '500
Timeout']
Пояснение к коду
Шаблон 500.*:
·
ищет
последовательность 500 в любом месте строки;
· затем захватывает все символы после неё до конца строки.
Функция
findall() просматривает весь текст,
поэтому положение кода в строке значения не имеет.
Методическое замечание. Здесь результаты начинаются с 500, потому что шаблон
возвращает совпадение от позиции, где встретилось 500, а не всю строку
целиком. Если требуется возвращать строку полностью (включая ERROR, CRITICAL), шаблон нужно расширять отдельно –
это уже уточнение аналитической задачи.
Поиск
строк, начинающихся с 500.
Если требуется выбрать только строки,
которые начинаются с кода 500, используется якорь начала
строки ^ и
режим многострочного текста.
import re logs = """200 OK500 Internal Server Error404 Not Found500 Timeout""" errors = re.findall(r"^500.*", logs, re.MULTILINE) print(errors)
Результат: ['500 Internal Server Error', '500
Timeout']
Почему используется re.MULTILINE?
По умолчанию:
· без флага re.MULTILINE символ ^ соответствует только началу всего текста.
Флаг re.MULTILINE позволяет:
·
интерпретировать
^ как начало каждой
строки внутри многострочного текста.
Без этого флага совпадение было бы найдено только в первой строке текста (таблица 2.5.1).
Таблица 2.5.1 – Сравнение подходов
|
Что делает |
|
|
|
Ищет код 500 в любом месте строки |
|
|
Ищет строки, начинающиеся с 500 |
|
|
Ищет строки, начинающиеся с 500, в многострочном тексте |
Методический
акцент. Использование
якорей (^,
$) и флагов (re.MULTILINE)
позволяет:
· уточнять область поиска;
· избегать ложных совпадений;
· формировать более строгие условия фильтрации.
В задачах анализа логов это особенно важно при автоматическом мониторинге и построении отчётов.
Итоги подраздела
В разделе 2.3 рассматриваются принципы применения регулярных выражений при обработке текстовых данных. Регулярные выражения используются для:
• формального описания структуры текстовых шаблонов;
• извлечения числовых и символьных фрагментов;
• проверки соответствия строк заданному формату;
• замены и очистки текста;
• фильтрации записей журналов и лог-файлов.
Важно различать шаблон (регулярное выражение) и функции модуля re, которые применяют этот шаблон к строке. Регулярные выражения применяются на этапе предварительной подготовки данных:
• до преобразования текста в численные структуры;
• перед передачей данных в библиотеки NumPy и Pandas;
• при очистке текстовых столбцов таблиц;
• при валидации входной информации.
Регулярные выражения выступают как промежуточный инструмент между внешним текстовым источником данных и структурированными объектами Python, используемыми для вычислений и анализа. Если в разделе 2.2 данные считываются из внешнего источника, то в разделе 2.3 выполняется их приведение к структурированному виду, что создаёт основу для последующего численного анализа. Освоение регулярных выражений повышает корректность подготовки данных и способствует надёжности последующих аналитических процедур.
1. Что такое регулярное выражение?
2. Чем отличается шаблон от функции модуля re?
3. Что означает префикс r в строке регулярного выражения?
4. Чем различаются функции search(), findall(), match() и sub()?
5. Что такое символьные классы (\d, \w, \s)?
6. Что такое квантификаторы?
7. Как работает отрицание в квадратных скобках?
8. Для чего используются якоря ^ и $?
9. Почему регулярные выражения рассматриваются как этап предварительной подготовки данных?
10. В каких аналитических задачах используются регулярные выражения?