Bezdepbonusu7Программирование: статьи и ответы

Regex по шагам

Регулярные выражения: шпаргалка и примеры для Python и JavaScript

Редакция Bezdepbonusu77 мин чтения

Регулярные выражения помогают найти, проверить и заменить текст по шаблону одной строкой кода. В шпаргалке собраны символы, квантификаторы и группы, а также примеры для Python и JavaScript с разбором различий между ними.

Текстовый редактор с кодом и регулярными выражениями для поиска
Фото: Jordi Burguet-Castell, CC BY-SA 4.0, Wikimedia Commons
Содержание
  1. Что это
  2. Классы символов
  3. Квантификаторы
  4. Группы
  5. Regex в Python
  6. Regex в JavaScript
  7. Готовые шаблоны
  8. Частые ошибки
  9. Частые вопросы

Что такое регулярные выражения и где их проверять

Регулярное выражение (regex, регулярка) - шаблон, который описывает, как выглядит нужный кусок текста. С его помощью находят телефоны в документе, проверяют формат почты в форме, вытаскивают даты из логов, массово переименовывают переменные в редакторе.

Синтаксис почти одинаков в Python, JavaScript, PHP, Java и в поиске VS Code, потому что все они выросли из одного семейства (Perl-совместимые выражения). Различаются детали: флаги, именованные группы, функции для поиска и замены. Они разобраны ниже отдельно.

Писать регулярку вслепую не нужно. Откройте regex101.com: слева выбираете диалект (Python или ECMAScript), вставляете шаблон и тестовый текст, а справа сайт объясняет каждый символ шаблона и подсвечивает совпадения. В VS Code то же самое работает в поиске по Ctrl+F, если включить значок .*.

Шпаргалка: символы и классы

Начнем с базовых кирпичиков. Обычные буквы и цифры совпадают сами с собой, а специальные символы . ^ $ * + ? ( ) [ ] { } | \ нужно экранировать обратным слешем, если вы ищете их буквально: \. найдет точку.

ШаблонЧто означаетПример совпадения
.Любой символ, кроме перевода строкик.т - кот, кит
\dЦифра\d\d - 42
\DНе цифрабуква, пробел
\wБуква, цифра или подчеркивание\w+ - user_1
\WНе \wпробел, запятая
\sПробельный символ: пробел, таб, перевод строки\s+ - несколько пробелов
[abc]Один символ из набора[аеиоу] - гласная
[^abc]Любой символ, кроме перечисленных[^0-9] - не цифра
[а-яё]Диапазонстрочная русская буква
a|bИликот|пес

Про кириллицу. В Python 3 \w по умолчанию понимает Unicode и находит русские буквы. В JavaScript \w - это только латиница, цифры и подчеркивание, даже с флагом u. Для русского текста в JS пишите [а-яё] с флагом i или \p{L} с флагом u. И не забывайте про букву ё: в диапазон а-я она не входит.

Квантификаторы и якоря

Квантификатор говорит, сколько раз повторяется предыдущий символ или группа.

ШаблонСколько разПример
*0 и больше\d*
+1 и больше\d+ - любое число
?0 или 1https? - http и https
{3}Ровно 3\d{3} - 495
{2,4}От 2 до 4\w{2,4}
{2,}2 и больше\s{2,} - двойные пробелы

Якоря не совпадают с символами, они отмечают позицию. ^ - начало строки, $ - конец, \b - граница слова. Шаблон ^\d+$ проверит, что вся строка состоит из цифр, а не просто содержит их. Без якорей проверка формата пропустит строку вида abc123.

Жадность

Квантификаторы по умолчанию жадные: захватывают как можно больше. Шаблон <.+> в строке <b>текст</b> найдет всю строку целиком, а не первый тег. Ленивая версия с вопросительным знаком <.+?> остановится на первой закрывающей скобке. Для HTML, впрочем, лучше брать парсер, а не регулярки.

Группы, обратные ссылки и проверки

Круглые скобки объединяют часть шаблона в группу. На нее можно повесить квантификатор, ее содержимое можно достать отдельно или подставить при замене.

  • (\d{2})\.(\d{2})\.(\d{4}) - дата, день, месяц и год попадут в группы 1, 2 и 3.
  • (?:ab)+ - группа без захвата, нужна только для повторения.
  • (?P<year>\d{4}) в Python и (?<year>\d{4}) в JavaScript - именованная группа. Буква P в Python обязательна, форма без нее вызовет ошибку unknown extension.
  • \1 - обратная ссылка на первую группу внутри шаблона: (\w+) \1 найдет повтор слова "что что".
  • (?=...) и (?!...) - опережающая проверка: \d+(?= руб) найдет число, только если за ним идет " руб".
  • (?<=...) и (?<!...) - ретроспективная проверка: (?<=\$)\d+ найдет сумму после знака доллара. В JavaScript поддерживается всеми современными браузерами и Node.js.

В строке замены группы обозначаются по-разному: в Python \1 или \g<year>, в JavaScript $1 или $<year>.

Регулярные выражения в Python: модуль re

В Python регулярки живут в стандартном модуле re. Шаблоны пишите в raw-строках с префиксом r, иначе Python сам начнет обрабатывать обратные слеши, и \b превратится в символ backspace.

import re

text = "Заказ 145 от 03.10.2026, заказ 77 от 15.10.2026"

re.search(r"\d+", text).group()        # '145' - первое совпадение
re.findall(r"заказ (\d+)", text, re.I)  # ['145', '77']
re.sub(r"(\d{2})\.(\d{2})\.(\d{4})", r"\3-\2-\1", text)
# 'Заказ 145 от 2026-10-03, заказ 77 от 2026-10-15'

for m in re.finditer(r"(?P<d>\d{2})\.(?P<m>\d{2})", text):
    print(m.group("d"), m.group("m"))

re.fullmatch(r"\+7\d{10}", "+79161234567")  # проверка формата целиком
re.split(r"[,;]\s*", "a, b;c")              # ['a', 'b', 'c']
ФункцияЧто возвращает
re.searchПервое совпадение в любом месте строки или None
re.matchСовпадение только с начала строки или None
re.fullmatchСовпадение всей строки целиком или None
re.findallСписок строк (или кортежей, если в шаблоне несколько групп)
re.finditerИтератор объектов Match с позициями и группами
re.subНовую строку с заменами
re.compileСкомпилированный шаблон для многократного использования

Флаги передаются аргументом: re.I (без учета регистра), re.M (^ и $ для каждой строки), re.S (точка ловит и перевод строки), re.X (можно писать шаблон с пробелами и комментариями). Если Python у вас еще не установлен, начните с инструкции как установить Python на Windows.

Регулярные выражения в JavaScript

В JavaScript регулярка - это объект RegExp. Чаще его пишут литералом между слешами, флаги ставятся после закрывающего слеша.

const text = "Заказ 145 от 03.10.2026, заказ 77 от 15.10.2026";

/\d+/.test(text);                       // true
text.match(/\d+/g);                     // ['145', '03', '10', '2026', ...]
text.replace(/(\d{2})\.(\d{2})\.(\d{4})/g, "$3-$2-$1");

for (const m of text.matchAll(/(?<d>\d{2})\.(?<m>\d{2})/g)) {
  console.log(m.groups.d, m.groups.m);
}

const re = new RegExp("заказ\\s(\\d+)", "gi"); // слеши удваиваются

Главные отличия от Python, которые ловят новичков:

  • Без флага g метод replace заменит только первое совпадение, а match вернет одно совпадение с группами. matchAll и replaceAll с регуляркой без g выбросят TypeError.
  • Регулярка с флагом g помнит позицию в свойстве lastIndex. Если вызвать test одной и той же регуляркой дважды подряд, второй результат может удивить. Для проверок формата флаг g не ставьте.
  • В конструкторе new RegExp("...") шаблон - обычная строка, поэтому каждый обратный слеш пишется дважды.
  • Флаги: g (все совпадения), i (регистр), m (многострочный), s (точка ловит перевод строки), u (Unicode и \p{...}), y (поиск строго с lastIndex), d (индексы групп).

Регулярки в JS часто комбинируют с методами массивов, например фильтруют список строк: emails.filter(e => /@gmail\.com$/i.test(e)). Про filter, map и reduce подробно в статье методы массивов JavaScript.

Готовые регулярные выражения для частых задач

Шаблоны ниже упрощенные и подходят для учебных задач и быстрой проверки. Для боевой валидации почты и телефонов лучше брать проверенные библиотеки.

  • Российский мобильный: ^(\+7|8)\d{10}$ (без пробелов и скобок).
  • Телефон с любыми разделителями: сначала удалите все лишнее re.sub(r"\D", "", phone), потом проверяйте длину.
  • Почта (упрощенно): ^[\w.+-]+@[\w-]+\.[\w.-]+$.
  • Дата ДД.ММ.ГГГГ: ^\d{2}\.\d{2}\.\d{4}$. Проверяет формат, а не существование даты: 31.02 пройдет.
  • Почтовый индекс РФ: ^\d{6}$.
  • IPv4 (формат): ^(\d{1,3}\.){3}\d{1,3}$, диапазон 0-255 не проверяется.
  • Двойные пробелы: \s{2,}, замена на один пробел.
  • Хештеги: #\w+ в Python, #[\p{L}\d_]+ с флагом u в JS.

Не пытайтесь одной огромной регуляркой проверить все сразу. Сначала нормализуйте строку обычным кодом (обрезка пробелов, удаление скобок и дефисов), потом проверяйте короткий шаблон, а сложную логику вроде корректности даты делайте через datetime.strptime в Python или Date в JS. Такой код проще читать и поддерживать, и он не зависнет на хитром вводе из-за катастрофического возврата.

Частые ошибки в регулярках

  1. Неэкранированная точка. site.ru совпадет и с "siteXru". Пишите site\.ru.
  2. Нет якорей при проверке. \d{6} найдет индекс внутри строки "1234567890". Для проверки формата нужны ^ и $ или re.fullmatch.
  3. Строка без r в Python. "\bслово\b" без префикса r ничего не найдет.
  4. Забытая ё. [а-я] пропустит слово "ёлка".
  5. Вложенные квантификаторы вроде (a+)+ на длинной строке могут работать минутами. Это называется катастрофический возврат и используется в атаках ReDoS.

Больше практики по языкам ищите в тегах Python и JavaScript.

Частые вопросы

Чем re.match отличается от re.search в Python?

re.match ищет совпадение только с начала строки, re.search ищет в любом месте. Для проверки, что вся строка соответствует шаблону, удобнее re.fullmatch.

Почему \w не находит русские буквы в JavaScript?

В JavaScript \w включает только латиницу, цифры и подчеркивание. Для кириллицы используйте диапазон [а-яё] с флагом i или класс \p{L} с флагом u.

Зачем в Python писать r перед строкой с регуляркой?

Префикс r делает строку сырой: обратные слеши передаются в модуль re как есть. Без него Python сам обработает последовательности вроде \b, и шаблон сломается.

Где проверить регулярное выражение онлайн?

На regex101.com и regexr.com: там можно выбрать диалект Python или JavaScript, увидеть совпадения и пояснение к каждому элементу шаблона.

Можно ли парсить HTML регулярками?

Для разовой простой задачи можно, но надежнее использовать парсер: BeautifulSoup в Python или DOMParser в браузере. Регулярки плохо справляются с вложенными тегами.

Источники

PythonJavaScript

Похожие материалы

Версии программ и команды проверены на дату публикации. Если что-то изменилось, сверяйтесь с официальной документацией. Нашли неточность? Напишите на admin@bezdepbonusu7.win.