Синтаксис регулярных выражений
Здесь приводится базовая информация о синтаксисе регулярных выражений.
Сочетаемость
Несколько регулярных выражений можно склеивать между собой, чтобы сформировать новые выражения.
Например, если
A
и B
являются регулярными выражениями, тогда AB
тоже является регулярным выражением.В общем случае, если строка
p
подпадает под шаблон A
, а другая строка q
подпадает под шаблон B
, то строка pq
подпадёт под AB
. Исключение составляют случаи, когда : 1.
A
или B
содержат условия; 2. в
A
или B
используются пограничные описатели (\b
); 3.
A
и/или B
содержат нумерованные группы.На заметку
Сложные выражения могут быть составлены из более простых. За более подробной информацией о регулярных выражениях можно обратиться к первому изданию книги Mastering Regular Expressions (Джеффри Фридл, русское издание — «Регулярные выражения»), или практически к любой другой книге об устройстве компиляторов.
Введение
Регулярные выражения могут содержать как специальные, так и обычные символы. Обычные символы, например,
A
, a
, 0
, уже можно расценивать, как простейшие регулярные выражения — под эти шаблоны подпадают собственно строки, состоящие из этих символов. Если склеить несколько символов, например, в шаблон cat
, то под этот шаблон подпадёт строка cat
.Некоторые символы имеют специальное значение и потому называются специальными (пример:
|
, (
). Обычные такие символы либо описывают целый класс обычных символов, либо воздействуют на то, как интерпретируется регулярное выражение.Специальные символы
Базовые | |
\ | Либо экранирует специальные символы, либо указывает на использование специальной последовательности (см. ниже). Помните: в Питоне обратный слеш тоже используется для экранирования в строковых литералах, поэтому зачастую в шаблонах рекомендуется использовать сырые строки (с префиксом r ), которые не требуют экранирования. |
. | По умолчанию описывает любой символ, кроме перевода строки. С флагом DOTALL — также и перевод строки. |
^ | Начало строки. С флагом MULTILINE — начало каждой из строк. |
$ | Завершение строки. С флагом MULTILINE — завершение каждой из строк. |
x|y | Описывает первое подходящее из указанных выражений x или y . При помощи | можно соединить и более двух выражений. |
[] | Описывает указанное в скобках множество допустимых символов. Специальные символы внутри множества не работают. Поддерживаются диапазоны, например: [a-z] , [Н-Я] , [0-8] . Описатели классов символов допускаются, но зависят от режима интерпретации выражения (ASCII , либо LOCALE ). Описать символы не входящие в указанное множество можно при помощи ^ после открывающей скобки, например: [^abc] , [^\d] . Чтобы включить символ ] во множество, его можно либо указать непосредственно после открывающей скобки, либо экранировать при помощи \ . |
Специальные последовательности (начинаются с обратного слеша — \ ) | |
\num | Где num — число (от 1 до 99). Ссылается на группу указанную при помощи её порядкового номера. Под группой с индексом 0 обычно понимается обнаруженная строка в целом. |
\A | Пустая строка в начале строки. |
\b | Пограничная пустая строка (в начале или конце слова). Определение слова может зависеть от текущей локали. Внимание: в диапазонах символизирует возврат на символ (backspace). |
\B | Пустая строка не в начале и не в конце слова (т.е. обычно внутри слова). |
\d | Описывает десятичную цифру. Для Юникода — это символы категории [Nd] , для ASCII и байт — это то же, что и [0-9] . |
\D | Нецифровой символ. |
\s | Пробельные символы. Для ASCII — то же, что и [ \t\n\r\f\v] , для Юникода включает дополнительные символы, например неразрывный пробел. |
\S | Непробельные символы. |
\w | Символы, которые могут входить в состав слов, включая числа и подчёркивание. Для ASCII и байт — то же, что и [a-zA-Z0-9_] . |
\W | Несловарные символы. |
\Z | Пустая строка в конце строки. |
Количественные описатели | |
* | 0 и более повторений предшествующего выражения. |
+ | 1 и более повторений предшествующего выражения. |
? | 0 или 1 повторение предшествующего выражения. |
{x} | x (число) повторений предшествующего выражения. |
{x,y} | От x до y повторений предшествующего выражения. Если опустить x , то предполагается 0; если опустить y , то предполагается неопределённое количество (запятую при этом опускать нельзя). |
+py3.11 {x,y}+ | Притяжательные количественные описатели. Сравните: под a{3,5}aa подпадает aaaaaa (под a{3,5} подходят первые 4 символа), в то время как при использовании a{3,5}+aa соответствие найдено не будет (найдутся пять символов, но за ними не будет aa . x{m,n}+ то же, что и (?>x{m,n}) . |
*? , +? , ?? , {x,y}? | Добавление ? к указанным описателям делает их нежадными, т.е. они станут описывать как можно меньшее количество символов. Сравните: под <.+> подпадёт вся строка <x>b<y> , в то время, как под <.+?> — только <x> . |
+py3.11 *+ , ++ , ?+ | Притяжательные количественные описатели. Сравните: под aa подпадает aaaa (под a подходят первые три символа), в то время как при использовании a+a соответствие найдено не будет (под a подходят все четрые символа, но за ними нет ещё одной a ). x*+ , x++ , x?+ то же что и (?>x*) , (?>x+) , (?>x?) соответственно. |
Группировка | |
(x) | Задаёт группу, в которую должно попасть выражение x , к которой можно обращаться в дальнейшем по индексу — \1 (если группа имеет номер 1). |
(?P<name>x) | Задаёт группу с именем name , в которую должно попасть выражение x . Групп в дальнейшем можно адресовать как по указанному имени, так и по индексу — (?P=name) или \1 (если группа имеет номер 1). |
(?:x) | Задаёт группу, в которую должно попасть выражение x , к которой нельзя будет обратиться в дальнейшем ни по индексу, ни по имени. |
(?#...) | Комментарий. При разборе выражения будет проигнорирован. |
Условия | |
x(?=y) | Описывает выражение x только если за ним следует y . Например: маршал (?=Жуков) обнаружит маршал в строке маршал Жуков , но не в маршал Конев . |
x(?!y) | Описывает выражение x только если за ним не следует y . Например: маршал (?!Жуков) обнаружит маршал в строке маршал Конев , но не в маршал Жуков . |
x(?<=y) | Описывает выражение y только если ему предшествует x . Например: (?<=маршал) Жуков обнаружит Жуков в строке маршал Жуков , но не в капитан Жуков . Внимание: использование количественных описателей не поддерживается, требуются строки фиксированной длины. |
x(?<!y) | Описывает выражение y только если ему не предшествует x . Например: (?<!маршал) Жуков обнаружит Жуков в строке капитан Жуков , но не в маршал Жуков . Внимание: использование количественных описателей не поддерживается, требуются строки фиксированной длины. |
+py2.4 (?(g)y|n) | Если группа g обнаружена, то описывает выражение y , иначе — выражение n . Например: под (?P<is_comrade>товарищ)?(?(is_comrade) и брат|тамбовский волк) подпадают строки товарищ и брат и тамбовский волк . |
Управление интерпретацией | |
(?aiLmsux) | Позволяет задать флаги интерпретации всего выражения без передачи параметра flag функциям. Значения символов: a — только ASCII; i — игнорировать регистр; L — использовать локаль; m — многострочный режим; s — точка обозначает любой символ; u — Юникод; x — дозволить описания в выражении. |
+py3.6 (?aiLmsux-imsx:...) | Позволяет задать флаги интерпретации указанного выражения. После минуса можно указать флаги, которые требуется сбросить. a , L , u — взаимоисключающие, |
Флаги интерпретации
+py3.0 re.A , re.ASCII | Если установлен, то \w , \W , \b , \B , \d , \D , \s и \S описывают только ASCII символы, а не Юникод. Внимание: для байтовых шаблонов не используется. |
re.DEBUG | Выводить отладочную информацию о скомпилированном выражении. |
re.I , re.IGNORECASE | Игнорировать регистр символов. Текущая локаль не влияет на работу, покуда не проставлен re.LOCALE . |
re.L , re.LOCALE | Если установлен, то \w , \W , \b , \B будут ориентироваться на настройки текущей локали. Рассчитан на работу с байтами. В +py3.0 использование не рекомендуется — работа с Юникодом даёт более надёжные результаты. |
re.M , re.MULTILINE | Многострочный режим. Если установлен, то ^ и $ будут находить начало и конец соответственно для каждой строки, включая переводы строк. В про время как по умолчанию на переводы строк указанные описатели не реагируют. |
re.S , re.DOTALL | Если установлен, то . обозначает любой символ, включая перевод строки. |
+py2.0 re.U , re.UNICODE | Если установлен, то \w , \W , \b , \B , \d , \D , \s и \S описывают символы Юникода. Внимание: для +py3.0 это режим по умолчанию. |
re.X , re.VERBOSE | Дозволяет описания в регулярных выражениях. Благодаря описаниям иногда шаблоны становятся более читаемыми. Описание можно поместить прямо в шаблон, начав его с # , при этом неэкранированные пробелы в шаблоне игнорируются. |
import re
# Компилируем выражение для последующего использования.
# Совместим два флага re.X и re.DEBUG
re_test = re.compile(r'''
(\d{4})\s # год
кот # просто кот
''', re.X | re.DEBUG)
# Строка '2018 кот' соответствует выражению.
# Получим содержимое первой группы (год).
re_test.match('2018 кот').group(1) # 2018
# Строка '2018 год' не соответствует выражению.
re_test.match('2018 год') # None
.
Синонимы поиска: Синтаксис регулярных выражений, named groups, re
В разделе «re (регулярные выражения)»:
re.compile
re.findall
re.fullmatch
re.match
re.search
re.split
re.sub
На заметку
У нас есть новостная группа в Telegram. Там же можно обсудить интересующие вопросы. Ссылка в самом низу страницы.