Модуль re
Конспект посвящён регулярным выражениям и модулю re
Регулярные выражения
Регулярные выражения (regexp, regex) — формальный язык, используемый в программах для поиска и осуществления манипуляций с подстрокой в тексте, используя шаблон (pattern).
Регулярное выражение состоит из обычных символов и специальных последовательностей. Оно обычно используется для:
- Поиска подстрок в строке;
- Разделения строки на подстроки;
- Замены части строки.
Любая строка сама по себе уже является регулярным выражением, так, шаблону Soup
будет соответствовать подстрока Soup
. Регулярные выражения являются регистрозависимыми. В них присутствуют специальные символы, которые нужно экранировать, если их требуется использовать по прямому назначению (просто как символы): .^$*+?{}[]\|()
.
Основные символы
Pattern | Description |
---|---|
. | Любой символ, кроме \n |
^ | Начало строки |
$ | Конец строки |
* | 0 или более повторений предшествующего элемента |
+ | 1 или более повторений предшествующего элемента |
? | 0 или 1 повторение предшествующего элемента |
{n} | Ровно n повторений предшествующего элемента |
{n,} | n или более повторений предшествующего элемента |
{n,m} | От n до m повторений предшествующего элемента |
[] | Любой одиночный символ из указанных в квадратных скобках |
[^] | Любой одиночный символ, не указанный в квадратных скобках |
\ | Экранирование специальных символов |
| | Логическое ИЛИ |
() | Группировка выражений и сохранение совпадений |
Метасимволы
Pattern | Description |
---|---|
\d | Любая цифра |
\D | Любой символ, кроме цифры |
\w | Любой алфавитный символ, цифра или _ |
\W | Любой символ, кроме алфавитного, цифры и _ |
\s | Любой пробельный символ ([ \f\n\r\t\v] ) |
\S | Любой непробельный символ |
\b | Граница слова. Соответствует позиции, а не символу |
\B | Не начало и не конец слова |
Наборы и диапазоны
В регулярных выражениях набор символов определяется с помощью специальных символов [
и ]
. Они часто используются для выполнения поиска, не зависящего от регистра.
[
]
символ .
можно не экранироватьТак, регулярному выражению [ns]a.\.csv
будет соответствовать:
sales1.csv
orders3.csv
sales2.csv
sales3.csv
apac1.csv
europe2.csv
sam.csv
na1.csv
na2.csv
sa1.csv
ca1.csv
Для указания диапазона символов используется -
. Например: [а-яА-Я] (буквы ё
и Ё
не включаются). Если в набор требуется включить -
, нужно указывать его вне диапазона.
Так, регулярному выражению [ns]a[0-9]\.csv
будет соответствовать:
sales1.csv
orders3.csv
sales2.csv
sales3.csv
apac1.csv
europe2.csv
sam.csv
na1.csv
na2.csv
sa1.csv
ca1.csv
[4-1]
или [z-a]
недопустимы.Если нужно соответствие с чем угодно, кроме некоторых символов, можно поставить ^
перед набором или диапазоном.
Так, регулярному выражению [ns]a[^0-9]\.csv
будет соответствовать:
sales1.csv
orders3.csv
sales2.csv
sales3.csv
apac1.csv
europe2.csv
sam.csv
na1.csv
na2.csv
sa1.csv
ca1.csv
Соответствие нескольким символам
Символ +
устанавливает соответствие с одним или более символами. Таким образом, если регулярное выражение a
соответствует одному символу a
, то регулярное выражение a+
соответствует одному или нескольким символам a
. Точно так же, учитывая, что регулярное выражение [0-9]
соответствует любой цифре, регулярное выражение [0-9]+
соответствует последовательности, состоящей из одной или нескольких цифр.
Для того чтобы установить соответствие с необязательными символами в регулярных выражениях используется специальный символ *
. Он используется в точности так, как +
: записывается сразу после символа или набора и соответствует нулю или большему количеству вхождений.
Чтобы установить соответствие с необязательным символом, используется ?
.
Так, регулярному выражению https?://[\w./]+
будет соответствовать:
URL http://stepik.org/ уже не безопасен. Для безопасного подключения вместо него используйте https://stepik.org/
Поскольку перечисленные специальные символы не позволяют явно установить минимальное и максимальное количество совпадений, существуют интервалы, которые определяются {
и }
.
- Чтобы указать точное количество совпадений, нужно вставить число в фигурные скобки:
#[0-9A-Fa-f]{6}
. - Чтобы указать интервал-диапазон, нужно указать два числа через запятую:
\d{1,2}[-/]\d{1,2}[-/]\d{2,4}
. - Чтобы указать “не более” или “не менее”, нужно ставить запятые перед или после числа-границы:
\d{,2}
или\d{2,}
.
Жадность и ленивость
Специальные символы *
и +
являются жадными. Они ищут наибольшее возможное соответствие. Например, есть регулярное выражение <B>.*</B>
:
Подписку нельзя оформить клиентам, живущим в <B>России</B>, а также <B>Беларуси</B>. Приносим свои извинения.
Если требуется использовать ленивое поведение, нужно ставить ?
после символа:
|Жадный|Ленивый|
|*
|*?
|
|+
|+?
|
|?
|??
|
|{m,n}
|{m,n}?
|
|{,n}
|{,n}?
|
|{m,}
|{m,}?
|
Теперь рассмотрим регулярное выражение <B>.*?</B>
:
Подписку нельзя оформить клиентам, живущим в <B>России</B>, а также <B>Беларуси</B>. Приносим свои извинения.
Группы
Группа — часть регулярного выражения (подвыражение), заключённое в круглые скобки: (
и )
. Группы обрабатываются как единый объект, поэтому, например, выражение (\daf){2}
будет означать повторение \daf
два раза.
Таким образом, если нужно найти в строке IP-адрес (без проверки на правильность), можно использовать (\d{1,3}\.){3}\d{1,3}
.
Группы можно вкладывать друг в друга, поэтому, если для уже озвученной задачи также необходима проверка на правильность адреса, можно использовать: (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((2[0-4]\d)|(25[0-5])|(1\d{2})|(\d{1,2}))
Чтобы сослаться на существующую группу, нужно экранировать её порядковый номер. Номера распределяются по открывающим скобкам, начиная с 1. Например, регулярному выражению (\b\w+\b)[ ]+\1
соответствует:
Это текст, в котором котором несколько слов слов повторяются, хотя они и не не должны повторяться повторяться.
В новых реализациях регулярных выражений можно именовать группу. В Python это делается так: (?P<name><regex>)
.
Модуль re
Для использования: import re
re
— модуль Python, предназначенный для работы с регулярными выражениями.
Объект Match
Объект типа Match
представляет собой результат поиска, выполненного с использованием регулярных выражений. Когда используются функции, такие как re.search()
, re.match()
и т.п., они возвращают объект типа Match
, если совпадение найдено.
Рассмотрим методы объекта.
group()
Метод Match.group([group1, ...])
возвращает одну или несколько подгрупп совпадения.
|
|
|
|
IndexError
Переданная в качестве аргумента группа может появляться несколько раз, при этом можно указывать любые группы в любом порядке:
|
|
Именованные группы также могут использоваться:
|
|
groups()
Метод Match.groups(default=None)
возвращает кортеж, содержащий все захваченные группы.
|
|
Группы, которые не смогли захватить какой-либо результат, по умолчанию будут иметь значение None
. Если в такой ситуации требуется вернуть значение, отличное от None
, то используется необязательный аргумент default
.
groupdict()
Метод Match.groupdict(default=None)
возвращает словарь, содержащий все захваченные именованные группы.
Если именованных групп в исходном регулярном выражении нет, метод groupdict()
возвращает пустой словарь.
start()
и end()
Методы Match.start([group])
и Match.stop([group])
возвращают индексы начала и конца подстроки, которая совпала с регулярным выражением.
В них также можно передать номер или название группы. В этом случае методы вернут индексы начала и конца подстроки, совпадающей с нужной группой.
span()
Метод `Match.span([group]) возвращает индексы начала и конца подстроки в виде кортежа, которая совпала с регулярным выражением. В него также можно передать номер или название группы, в этом случае метод вернет индексы начала и конца подстроки в виде кортежа, совпадающей с нужной группой.
Функция search()
Функция re.search(pattern, string, flags=0)
сканирует строку в поисках первого совпадения с регулярным выражением и возвращает объект типа Match
или значение None
, если ни одна позиция в строке не соответствует регулярному выражению.
Аргументы:
pattern
— шаблон регулярного выраженияstring
— строка для поискаflags
— один или несколько флагов
|
|
|
|
Функция match()
Функция re.match(pattern, string, flags=0)
возвращает объект типа Match
, если начало строки соответствуют регулярному выражению, или значение None
в противном случае.
|
|
|
|
Функция fullmatch()
Функция re.fullmatch(pattern, string, flags=0)
возвращает объект типа Match
, если вся строка соответствует регулярному выражению, или значение None
в противном случае. Её удобно использовать для валидации правильности данных.
|
|
|
|
Функция escape()
Функция re.escape(pattern)
экранирует специальные символы в строке.
|
|
Функция findall()
Функция re.findall(pattern, string, flags=0)
возвращает все неперекрывающиеся совпадения с регулярным выражением в виде списка строк. Строка сканируется слева направо, и совпадения возвращаются в найденном порядке.
|
|
Если регулярное выражение содержит одну группу, то findall()
вернёт список соответствующих групп, а не список полных совпадений с регулярным выражением:
|
|
Если регулярное выражение содержит несколько групп, то findall()
вернёт список кортежей, каждый из которых содержит захваченные группы. При этом длина каждого кортежа равна указанному количеству групп:
|
|
|
|
Функция finditer()
Функция re.finditer(pattern, string, flags=0)
возвращает все неперекрывающиеся совпадения с регулярным выражением в виде итератора, содержащего объекты типа Match
. Строка сканируется слева направо, и совпадения возвращаются в найденном порядке.
|
|
|
|
Функции findall()
и finditer()
очень похожи, но есть два отличия:\
findall()
возвращает список, в то время какfinditer()
возвращает итератор;findall()
возвращает список, содержащий фактические строки, в то время как элементами итератора, который возвращаетfinditer()
, являются объекты типаMatch
.
Функция sub()
Функция re.sub(pattern, repl, string, count=0, flags=0)
возвращает строку, полученную путем замены всех найденных неперекрывающихся вхождений регулярного выражения pattern
в строке string
на строку замены repl
. Если шаблон регулярного выражения не найден, строка возвращается без изменений.
Аргумент repl
может быть строкой или функцией. Если repl
это строка, то в ней обрабатываются все обратные слеши, то есть \n
преобразуется в символ новой строки, \r
преобразуется в возврат каретки и т. д.
Аргумент count
используется для ограничения количеств замен.
Замена строкой
Если repl
является строкой, то sub()
вставляет ее в строку поиска string
вместо любых последовательностей, соответствующих регулярному выражению pattern
.
|
|
|
|
При использовании функции sub()
также можно использовать пронумерованные обратные ссылки (\<n>
) в аргументе repl
, которым будет соответствовать текст захваченной группы. Обратные ссылки, такие как \2
, заменяются подстрокой, соответствующей группе №2 в шаблоне регулярного выражения:
|
|
Аналогично работает и с именованными группами.
Замена с помощью функции
Если в качестве аргумента repl
использовать функцию, то sub()
вызовет эту функцию для каждого найденного совпадения. Она передает каждый соответствующий объект типа Match
в качестве аргумента функции для предоставления информации о совпадении, при этом возвращаемое из функции значение становится строкой замены.
|
|
Функция subn()
Функция re.subn(pattern, repl, string, count=0, flags=0)
идентична функции sub()
, за тем исключением, что она возвращает кортеж, состоящий из изменённой строки и количества сделанных замен.
|
|
|
|
Функция split()
Функция re.split(pattern, string, maxsplit=0, flags=0)
разбивает строку на подстроки, используя регулярное выражение в качестве разделителя, и возвращает подстроки в виде списка.
Аргумент maxsplit
используется для ограничения количества разбиений.
|
|
Если шаблон регулярного выражения содержит группы захвата, то возвращаемый список помимо подстрок также включает в себя эти группы:
|
|
|
|
Если нужно использовать группы, но при этом не нужно, чтобы разделители включались в результирующий список, то можно использовать группы без захвата, используя синтаксис (?:<regex>)
:
|
|
Функция compile()
Функция re.compile(pattern, flags=0)
предварительно компилирует регулярное выражение в специальный объект (Pattern
), который можно повторно использовать позже.
Таким образом, если одно и то же регулярное выражение используется несколько раз, предварительная компиляция позволяет отделить определение регулярного выражения от его использования, что повышает читабельность кода.
re
компилирует и кэширует регулярное выражение, когда оно используется в вызове функции. Если одно и то же регулярное выражение используется впоследствии в том же коде, оно не перекомпилируется. Вместо этого скомпилированное значение извлекается из кэша. В общем, нет никаких веских причин для компиляции регулярного выражения. Это всего лишь еще один инструмент в вашем наборе инструментов, который вы можете использовать, если считаете, что он улучшит читабельность или структуру вашего кода.
|
|
Скомпилированный объект регулярного выражения поддерживает следующие методы:
search(string, pos, endpos)
match(string, pos, endpos)
fullmatch(string, pos, endpos)
findall(string, pos, endpos)
finditer(string, pos, endpos)
Данные методы ведут себя так же, как соответствующие (одноименные) им функции модуля re
, за исключением того, что они также поддерживают необязательные аргументы pos
и endpos
.
Существует два способа использования скомпилированного объекта регулярного выражения.
1 способ
Можно указать объект в качестве первого аргумента для функций модуля re
, вместо шаблона регулярного выражения:
|
|
2 способ
Можно вызывать функции как методы непосредственно из объекта регулярного выражения:
|
|
Флаги
Некоторые рассмотренные функции принимают необязательный аргумент flags
. Использование флагов изменяет поведение синтаксического анализа регулярных выражений, позволяя еще больше уточнить сопоставление с образцом.
В приведенной ниже таблице кратко перечислены доступные флаги:
Shortname | Fullname | Purpose |
---|---|---|
re.I | re.IGNORECASE | Игнорирует регистр символов |
re.M | re.MULTILINE | Используется совместно со специальными символами ^ и $ , в первом случае возвращает совпадения в начале каждой новой строки \n , во втором – в конце \n |
re.S | re.DOTALL | Заставляет символ . возвращать совпадения по абсолютно всем символам, включая \n |
re.X | re.VERBOSE | Разрешает комментарии в регулярном выражении |
- | re.DEBUG | Показывает отладочную информацию о скомпилированном регулярном выражении |
re.A | re.ASCII | Указывает кодировку ASCII для классификации символов \w , \W , \b , \B , \d , \D , \s , \S |
re.U | re.UNICODE | Указывает кодировку Unicode для классификации символов \w , \W, \b , \B , \d , \D , \s , \S |
re.L | re.LOCALE | Учитывает региональные настройки при использовании метасимволов \w , \W , \b , \B , \s , \S |
|
|
|
Основной источник: https://stepik.org/course/82541
Дополнительные источники:
