Диалекты: Python vs JavaScript vs grep
Понимаем, что «регулярки везде одинаковые» — только на 90%, и где прячутся оставшиеся 10%.
Базовый синтаксис (
. * + ? [] () |, классы\d \w \s) совпадает почти везде; различия — в группах, проверках, флагах и экранировании.
Что общего
Хорошая новость: ядро одинаково во всех популярных диалектах. Точка, кванторы, классы символов, готовые классы \d \w \s, якоря ^ $, группы и альтернация работают так же, как мы изучали. Освоив Python-регулярки, вы прочитаете паттерн в JavaScript, Java или Go почти без переучивания.
Python и JavaScript: близнецы с нюансами
| Аспект | Python | JavaScript |
| именованная группа | (?P<name>...) | (?<name>...) |
| ссылка в замене | \1, \g<name> | $1, $<name> |
| флаг «все совпадения» | есть findall | флаг g на регулярке |
| lookbehind | фиксированной длины | переменной длины (совр. движки) |
Например, замена даты. В Python ссылки на группы — \1:
import re
print(re.sub(r"(\d{4})-(\d{2})", r"\2/\1", "2024-06"))
Вывод:
06/2024
А в JavaScript тот же смысл записали бы как str.replace(/(\d{4})-(\d{2})/, "$2/$1") — ссылки через $1, $2. Логика одна, синтаксис подстановки разный.
grep: два режима
В командной строке grep по умолчанию использует базовые регулярки (BRE), где +, ?, {}, () и | нужно экранировать обратным слэшем: \(, \+. Расширенный режим (grep -E или egrep) делает их обычными метасимволами — как мы привыкли:
# базовый grep — скобки и плюс экранируют
grep '\(ab\)\+' file.txt
# расширенный — как в Python
grep -E '(ab)+' file.txt
Поэтому, копируя паттерн из туториала в grep, добавляйте -E — иначе скобки и кванторы поймут буквально.
Главные точки расхождения
- Синтаксис именованных групп и ссылок в замене — он разный (см. таблицу).
- Флаги: где-то это аргумент функции (Python), где-то буква на самой регулярке (JS:
/.../gi). - Экранирование в shell: в
grep/sedещё и оболочка обрабатывает кавычки — паттерны берут в одинарные кавычки. - Поддержка lookbehind и продвинутых конструкций отличается между движками.
Итог
- Ядро регулярок одинаково во всех языках — навык переносится.
- Различаются: именованные группы, ссылки в замене (
\1vs$1), способ задания флагов. grepпо умолчанию — базовый синтаксис; для привычного беритеgrep -E.- Перенося паттерн в новую среду, сверяйтесь с её документацией по этим точкам.