re — простые регулярные выражения

Этот модуль реализует операции с регулярными выражениями. Поддерживаемый синтаксис регулярных выражений представляет собой подмножество модуля re из CPython (и фактически является подмножеством расширенных регулярных выражений POSIX).

Поддерживаемые операторы и специальные последовательности:

.

Соответствует любому символу.

[...]

Соответствует набору символов. Поддерживаются отдельные символы и диапазоны, включая инвертированные наборы (например, [^a-c]).

^

Соответствует началу строки.

$

Соответствует концу строки.

?

Соответствует нулю или одному вхождению предыдущего подшаблона.

*

Соответствует нулю или более вхождениям предыдущего подшаблона.

+

Соответствует одному или более вхождениям предыдущего подшаблона.

??

Нежадная версия ?, соответствует нулю или одному вхождению, с предпочтением нуля.

*?

Нежадная версия *, соответствует нулю или более вхождениям, с предпочтением наименьшего соответствия.

+?

Нежадная версия +, соответствует одному или более вхождениям, с предпочтением наименьшего соответствия.

|

Соответствует либо левому, либо правому подшаблону этого оператора.

(...)

Группировка. Каждая группа является захватывающей (захваченную ею подстроку можно получить с помощью метода match.group()).

(?:...)

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

\d

Соответствует цифре. Эквивалентно [0-9].

\D

Соответствует нецифровому символу. Эквивалентно [^0-9].

\s

Соответствует пробельному символу. Эквивалентно [ \t-\r].

\S

Соответствует непробельному символу. Эквивалентно [^ \t-\r].

\w

Соответствует «символам слова» (только ASCII). Эквивалентно [A-Za-z0-9_].

\W

Соответствует символам, не являющимся «символами слова» (только ASCII). Эквивалентно [^A-Za-z0-9_].

\

Экранирующий символ. Любой другой символ, следующий за обратной косой чертой, кроме перечисленных выше, воспринимается буквально. Например, \* эквивалентно литеральному * (не обрабатывается как оператор *). Обратите внимание, что \r, \n и т. п. не обрабатываются особым образом и будут эквивалентны литеральным буквам r, n и т. д. Из-за этого не рекомендуется использовать сырые строки Python (r"") для регулярных выражений. Например, r"\r\n" при использовании в качестве регулярного выражения эквивалентно "rn". Чтобы сопоставить символ CR, за которым следует LF, используйте "\r\n".

НЕ ПОДДЕРЖИВАЕТСЯ:

  • счётные повторения ({m,n})

  • именованные группы ((?P<name>...))

  • более сложные утверждения (\b, \B)

  • экранирование специальных символов вроде \r, \n — используйте вместо этого собственное экранирование Python

  • и т. д.

Пример:

import re

# As re doesn't support escapes itself, use of r"" strings is not
# recommended.
regex = re.compile("[\r\n]")

regex.split("line1\rline2\nline3\r\n")

# Result:
# ['line1', 'line2', 'line3', '', '']

Функции

re.compile(regex_str: str, flags: int = 0) 'regex'

Компилирует регулярное выражение, возвращает объект regex.

re.search(regex_str: str, string: str) 'match | None'

Компилирует regex_str и ищет его в string. В отличие от match, этот метод ищет в строке первую позицию, которая соответствует регулярному выражению (которая всё же может быть 0, если регулярное выражение привязано к началу).

re.sub(regex_str: str, replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str

Компилирует regex_str и ищет его в string, заменяя все соответствия на replace и возвращая новую строку.

replace может быть строкой или функцией. Если это строка, то можно использовать escape-последовательности вида \<number> и \g<number> для подстановки соответствующей группы (или пустой строки для несопоставленных групп). Если replace — функция, то она должна принимать один аргумент (соответствие) и возвращать строку замены.

Если задан параметр count и он не равен нулю, то подстановка остановится после выполнения указанного количества замен. Аргумент flags игнорируется.

Объекты регулярных выражений

Скомпилированное регулярное выражение. Экземпляры этого класса создаются с помощью re.compile().

class re.regex

Объект скомпилированного регулярного выражения, возвращаемый re.compile().

match(string: str, pos: int = 0, endpos: int | None = None) 'match | None'

Применяет это скомпилированное регулярное выражение к string, привязывая его к началу области поиска, и возвращает объект match или None, если регулярное выражение не соответствует. Это эквивалент функции уровня модуля match для скомпилированного шаблона, и он значительно эффективнее, когда один и тот же шаблон применяется к нескольким строкам.

Необязательный параметр pos задаёт индекс в string, с которого должен начинаться поиск; по умолчанию он равен 0. Это не полностью эквивалентно срезу строки; шаблонный символ '^' соответствует реальному началу строки и позициям сразу после символа новой строки, но не обязательно индексу, с которого должен начинаться поиск.

Необязательный параметр endpos ограничивает, насколько далеко выполняется поиск в string; всё будет так, как если бы строка имела длину endpos символов, поэтому ищутся только символы от pos до endpos - 1. Если endpos равен None (по умолчанию), поиск выполняется по всей строке.

search(string: str, pos: int = 0, endpos: int | None = None) 'match | None'

Сканирует string в поисках первого места, где это скомпилированное регулярное выражение даёт соответствие, и возвращает объект match или None, если ни одна позиция не соответствует. Это эквивалент функции уровня модуля search() для скомпилированного шаблона, и он значительно эффективнее, когда один и тот же шаблон применяется к нескольким строкам.

Необязательный параметр pos задаёт индекс в string, с которого должен начинаться поиск; по умолчанию он равен 0. Это не полностью эквивалентно срезу строки; шаблонный символ '^' соответствует реальному началу строки и позициям сразу после символа новой строки, но не обязательно индексу, с которого должен начинаться поиск.

Необязательный параметр endpos ограничивает, насколько далеко выполняется поиск в string; всё будет так, как если бы строка имела длину endpos символов, поэтому ищутся только символы от pos до endpos - 1. Если endpos равен None (по умолчанию), поиск выполняется по всей строке.

sub(replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str

Ищет это скомпилированное регулярное выражение в string, заменяя все соответствия на replace, и возвращает новую строку. Это эквивалент функции уровня модуля sub() для скомпилированного шаблона, и он значительно эффективнее, когда один и тот же шаблон применяется к нескольким строкам.

replace может быть строкой или функцией. Если это строка, то можно использовать escape-последовательности вида \<number> и \g<number> для подстановки соответствующей группы (или пустой строки для несопоставленных групп). Если replace — функция, то она должна принимать один аргумент (соответствие) и возвращать строку замены.

Если задан параметр count и он не равен нулю, то подстановка остановится после выполнения указанного количества замен. Аргумент flags игнорируется.

split(string: str, max_split: int = -1, /) List[str]

Разбивает string с помощью регулярного выражения. Если задан max_split, он указывает максимальное число выполняемых разбиений. Возвращает список строк (если задан max_split, в нём может быть до max_split+1 элементов).

Объекты соответствия

Объект соответствия хранит результат успешного сопоставления.

class re.match(regex_str: str, string: str)

Сопоставляет regex_str со string, привязывая к началу строки, и возвращает объект соответствия или None, если соответствия нет. Это сокращение уровня модуля: re.match(regex_str, string) эквивалентно re.compile(regex_str).match(string).

Тот же объект соответствия также возвращается функцией search(), методами скомпилированного шаблона regex.match() / regex.search() и передаётся в функцию замены, используемую sub().

group(index: int) str

Возвращает соответствующую (под)строку. index равен 0 для всего соответствия, 1 и выше — для каждой захватывающей группы. Поддерживаются только числовые группы.