Регулярное выражение, или regex, представляет собой шаблон для поиска фрагментов текста. Обычный поиск требует точного слова или числа. Regex позволяет описать правило, например «найти любую последовательность цифр», «найти дату из двух цифр, точки, ещё двух цифр и четырёхзначного года» или «найти два и более пробела подряд».
Я воспринимаю регулярки как компактный язык команд для работы с текстом. Regex не понимает смысл документа и не рассуждает о содержании. Движок последовательно проверяет символы и выбирает участки, подходящие под заданный шаблон. Такой механизм помогает быстро обрабатывать журналы событий, таблицы, программный код, списки адресов, документы и результаты выгрузок.
Чем regex отличается от обычного поиска
Представим три строки с номерами заказов.
Заказ 127 отправлен
Заказ 9812 отменён
Заказ 54 ожидает оплаты
Обычный поиск по значению 127 найдёт только первый номер. Поиск по слову Заказ покажет все строки, но не выделит номера. Регулярное выражение [0-9]+ найдёт сразу 127, 9812 и 54.
Конструкция [0-9] означает одну цифру от нуля до девяти. Знак + требует один или несколько повторов предыдущего элемента. В результате движок ищет не конкретное число, а любую непрерывную последовательность цифр.
| Задача | Обычный поиск | Regex |
|---|---|---|
| Найти конкретный год | 2026 |
2026 |
| Найти любые числа | Нужно перечислять значения | [0-9]+ |
| Найти несколько вариантов слова | Несколько отдельных запросов | кот|пёс |
| Найти лишние пробелы | Поиск нескольких пробелов вручную | [ ]{2,} |
Регулярные выражения применяют разработчики, системные администраторы, аналитики, тестировщики, редакторы и специалисты по информационной безопасности. Regex встроен в языки программирования, базы данных, командные утилиты и текстовые редакторы. Visual Studio Code, Notepad++, IntelliJ IDEA и многие другие программы позволяют включить регулярный поиск прямо в панели поиска и замены.
Единого полностью универсального синтаксиса не существует. JavaScript, Python, Java, .NET, PCRE и другие движки поддерживают общую основу, но расходятся в отдельных конструкциях, режимах и правилах обработки Unicode. Шаблон, который работает в одном инструменте, нужно проверять перед переносом в другой. Базовые конструкции и особенности JavaScript подробно собраны в руководстве MDN.
Как читать простые регулярные выражения
Самый простой regex состоит из обычного текста.
кот
Такой шаблон найдёт сочетание букв кот в словах кот, котёнок и скотина. Регулярное выражение пока почти не отличается от обычного поиска. Специальные символы позволяют уточнить правило.
| Конструкция | Что означает | Пример |
|---|---|---|
[0-9] |
Одна цифра от 0 до 9 | 7 |
[abc] |
Один символ из набора | a, b или c |
. |
Почти любой одиночный символ | a, 7 или ? |
+ |
Один или несколько повторов | 77 |
* |
Ноль или несколько повторов | Совпадение может оказаться пустым |
? |
Ноль или один повтор | Элемент необязателен |
{4} |
Ровно четыре повтора | 2026 |
{2,5} |
От двух до пяти повторов | 123 |
. |
Обычная точка | . |
Точка часто становится первой ловушкой для начинающих. В большинстве популярных движков символ . означает любой одиночный символ, кроме перевода строки. Для поиска настоящей точки нужно поставить перед ней обратную косую черту и получить .. Такой приём называют экранированием.
Сокращение d обычно связывают с цифрами, но разные движки трактуют его неодинаково. В JavaScript d соответствует диапазону [0-9]. Python без специального режима может считать цифрами и некоторые другие десятичные символы Unicode. Для поиска привычных цифр от 0 до 9 явная запись [0-9] предсказуемее.
В JavaScript регулярное выражение часто записывают между косыми чертами.
/[0-9]+/g
Шаблоном служит часть [0-9]+. Косые черты обозначают границы литерала регулярного выражения, а флаг g включает поиск всех совпадений. В поле поиска текстового редактора обычно вводят только сам шаблон без окружающих косых черт.
Три практические задачи для начала
Как найти все числа
Возьмём строку с количеством товаров.
На складе 18 ноутбуков, 240 мышей и 7 мониторов.
Для поиска всех целых положительных чисел подойдёт выражение
[0-9]+
Движок вернёт три совпадения.
18
240
7
Простой шаблон не распознаёт число как математический объект. В записи -12,5 регулярка найдёт 12 и 5 как два отдельных фрагмента. Минус, десятичный разделитель, проценты и разделители тысяч придётся добавлять в правило отдельно.
Такое ограничение хорошо показывает принцип работы regex. Движок не знает, что автор текста подразумевал отрицательное дробное число. Регулярное выражение видит только последовательность символов, подходящую под шаблон.
Как найти даты в тексте
Рассмотрим несколько строк.
Отчёт создан 03.08.2026.
Документ обновлён 17.09.2026.
Следующая проверка назначена на 2026-10-04.
Даты в формате дд.мм.гггг можно найти таким выражением.
[0-9]{2}.[0-9]{2}.[0-9]{4}
Конструкция {2} требует ровно две цифры, {4} требует четыре цифры, а . обозначает настоящую точку. Regex найдёт 03.08.2026 и 17.09.2026, но пропустит 2026-10-04, поскольку последний фрагмент записан в другом формате.
Поиск даты нельзя путать с проверкой календарной корректности. Строки 99.99.2026 и 31.02.2026 тоже подходят под шаблон. Количество цифр и расположение точек правильные, но таких дат в календаре нет.
Для проверки целой строки в обычном режиме часто добавляют начало и конец.
^[0-9]{2}.[0-9]{2}.[0-9]{4}$
Символ ^ обозначает начало строки, а $ обозначает конец. Такой вариант отклонит посторонний текст до или после даты, но всё равно пропустит 31.02.2026. Календарную корректность лучше проверять библиотекой языка программирования.
from datetime import datetime
def is_valid_date(value):
try:
datetime.strptime(value, "%d.%m.%Y")
return True
except ValueError:
return False
print(is_valid_date("27.07.2026"))
print(is_valid_date("31.02.2026"))
Первый вызов вернёт True, второй вернёт False. Regex здесь отвечает за форму записи, а календарная библиотека проверяет допустимость дня, месяца и года.
Как убрать повторяющиеся пробелы
После копирования текста из PDF, таблицы или веб-страницы между словами иногда остаётся несколько пробелов.
Регулярные выражения помогают быстро исправлять текст.
Найти два и более обычных пробела подряд можно таким шаблоном.
[ ]{2,}
Конструкция {2,} означает не меньше двух повторов. В поле замены нужно поставить один пробел. После обработки получится нормальная строка.
Регулярные выражения помогают быстро исправлять текст.
Шаблон s+ выглядит короче, но действует шире. Класс s во многих движках включает не только обычный пробел, но и табуляцию, перевод строки и другие пробельные символы. Замена всех совпадений на один пробел способна склеить абзацы. Для простой чистки текста безопаснее искать именно повторяющиеся обычные пробелы.
Python позволяет выполнить все три операции несколькими строками.
import re
text = """
Заказ 127 создан 03.08.2026.
Заказ 9812 обновлён 17.09.2026.
"""
numbers = re.findall(r"[0-9]+", text)
dates = re.findall(r"[0-9]{2}.[0-9]{2}.[0-9]{4}", text)
clean_text = re.sub(r"[ ]{2,}", " ", text)
print(numbers)
print(dates)
print(clean_text)
Префикс r перед строкой создаёт в Python так называемую сырую строку. Такой формат упрощает запись обратных косых черт и снижает риск случайно превратить часть regex в управляющую последовательность самой строки Python.
Где тренироваться и где regex лучше не применять
Начать можно в Visual Studio Code или Notepad++. В окне поиска нужно включить режим регулярных выражений, обычно кнопкой .*. Для быстрых экспериментов подходит сервис regex101, который подсвечивает совпадения и объясняет отдельные части шаблона.
Онлайн-сервисы следует считать сторонними площадками. Не вставляйте туда пароли, токены доступа, персональные данные, внутренние журналы компании и закрытые документы. Для обучения достаточно выдуманного текста. Рабочие файлы безопаснее проверять локально.
Перед массовой заменой я сначала запускаю только поиск и просматриваю несколько совпадений. Затем копирую небольшой фрагмент данных в отдельный файл и проверяю замену. Такой порядок защищает от шаблонов, которые случайно захватывают больше текста, чем планировалось.
- Опишите нужный фрагмент обычными словами.
- Подготовьте подходящие и неподходящие примеры.
- Напишите самый простой возможный шаблон.
- Проверьте каждое найденное совпадение.
- Добавляйте условия по одному.
- Запускайте замену на копии файла.
Regex хорошо работает с повторяющейся текстовой структурой, но не заменяет полноценный парсер. Регулярки подходят для номеров, дат, строк фиксированного формата, простых журналов и очистки текста. Вложенный HTML, программный код, сложный JSON и документы с контекстными правилами надёжнее разбирать специализированными библиотеками.
Миф о мгновенной работе любого регулярного выражения тоже неверен. Некоторые сочетания вложенных повторителей и альтернатив заставляют движок многократно возвращаться назад и перебирать варианты. На длинной строке плохо составленный шаблон может резко загрузить процессор. Такой класс проблем называют ReDoS, или отказом в обслуживании через регулярное выражение. OWASP рекомендует ограничивать размер входных данных, осторожно составлять шаблоны и учитывать время выполнения при обработке недоверенного ввода.
Начинающему не нужно сразу разбираться в обратных ссылках, просмотре вперёд и особенностях возврата движка. Для старта достаточно трёх рабочих шаблонов. Выражение [0-9]+ находит последовательности цифр, [0-9]{2}.[0-9]{2}.[0-9]{4} ищет даты выбранного формата, а [ ]{2,} находит повторяющиеся пробелы.
Регулярные выражения становятся понятнее, когда шаблон читают слева направо и переводят каждый фрагмент на обычный язык. Не пытайтесь сразу написать идеальную конструкцию. Соберите простое правило, проверьте результат, затем постепенно добавляйте ограничения. Такой подход полезнее заучивания длинных таблиц с символами и снижает риск испортить данные неудачной заменой.
