Модуль Re для регулярных выражений в Python

1001

Регулярные выражения — специальная последовательность символов, которая помогает сопоставлять или находить строки python с использованием специализированного синтаксиса, содержащегося в шаблоне. Регулярные выражения распространены в мире UNIX.

Модуль re предоставляет полную поддержку выражениям, подобным Perl в Python. Модуль re поднимает исключение re.error, если возникает ошибка при компиляции или использовании регулярного выражения.

Давайте рассмотрим две функции, которые будут использоваться для обработки регулярных выражений. Важно так же заметить, что существуют символы, которые меняют свое значение, когда используются в регулярном выражении.Чтобы избежать путаницы при работе с регулярными выражениями, записывайте строку как r'expression'.

Функция match

Эта функция ищет pattern в string и поддерживает настройки с помощью дополнительного flags.
Ниже можно увидеть синтаксис данной функции:

re.match(pattern, string, flags=0)

Описание параметров:

Параметр & Описание
1pattern — строка регулярного выражения (r'g.{3}le')
2string — строка, в которой мы будем искать соответствие с шаблоном в начале строки ('google')
3flags — модификаторы, перечисленными в таблице ниже. Вы можете указать разные флаги с помощью побитового OR

Функция re.match возвращает объект match при успешном завершении, или None при ошибке. Мы используем функцию group(num) или groups() объекта match для получения результатов поиска.

Метод совпадения объектов и описание
1group(num=0) — этот метод возвращает полное совпадение (или совпадение конкретной подгруппы)
2groups() — этот метод возвращает все найденные подгруппы в tuple

Пример функции re.match

import re


title = "Error 404. Page not found"
exemple = re.match( r'(.*)\. (.*?) .*', title, re.M|re.I)

if exemple:
   print("exemple.group() : ", exemple.group())
   print("exemple.group(1) : ", exemple.group(1))
   print("exemple.group(2) : ", exemple.group(2))
   print("exemple.groups():", exemple.groups())
else:
   print("Нет совпадений!")

Когда вышеуказанный код выполняется, он производит следующий результат:

exemple.group(): Error 404. Page not found
exemple.group(1): Error 404
exemple.group(2): Page
exemple.groups(): ('Error 404', 'Page')

Эта функция выполняет поиск первого вхождения pattern внутри string с дополнительным flags.
Пример синтаксиса для этой функции:

re.search(pattern, string, flags=0)

Описание параметров:

Параметр & Описание
1pattern — строка регулярного выражения
2string — строка, в которой мы будем искать первое соответствие с шаблоном
3flags — модификаторы, перечисленными в таблице ниже. Вы можете указать разные флаги с помощью побитового OR

Функция re.search возвращает объект match если совпадение найдено, и None, когда нет совпадений. Используйте функцию group(num) или groups() объекта match для получения результата функции.

Способы совпадения объектов и описание
1group(num=0) — метод, который возвращает полное совпадение (или же совпадение конкретной подгруппы)
2groups() — метод возвращает все сопоставимые подгруппы в tuple

Пример функции re.search

import re


title = "Error 404. Page not found"
# добавим пробел в начало паттерна
exemple = re.search( r' (.*)\. (.*?) .*', title, re.M|re.I)

if exemple:
   print("exemple.group():", exemple.group())
   print("exemple.group(1):", exemple.group(1))
   print("exemple.group(2):", exemple.group(2))
   print("exemple.groups():", exemple.groups())
else:
   print("Нет совпадений!")

Запускаем скрипт и получаем следующий результат:

exemple.group():  404. Page not found
exemple.group(1): 404
exemple.group(2): Page
exemple.groups(): ('404', 'Page')

Python предлагает две разные примитивные операции, основанные на регулярных выражениях: match выполняет поиск паттерна в начале строки, тогда как search выполняет поиск по всей строке.

Пример разницы re.match и re.search

import re


title = "Error 404. Page not found"
match_exemple = re.match( r'not', title, re.M|re.I)

if match_exemple:
   print("match --> match_exemple.group():", match_exemple.group())
else:
   print("Нет совпадений!")

search_exemple = re.search( r'not', title, re.M|re.I)
if search_exemple:
   print("search --> search_exemple.group():", search_exemple.group())
else:
   print("Нет совпадений!")

Когда этот код выполняется, он производит следующий результат:

Нет совпадений!
search --> search_exemple.group(): not

Метод Sub

Одним из наиболее важных методов модуля re, которые используют регулярные выражения, является re.sub.
Пример синтаксиса sub:

re.sub(pattern, repl, string, max=0)

Этот метод заменяет все вхождения pattern в string на repl, если не указано на max. Он возвращает измененную строку.

Пример

import re


born = "05-03-1987 # Дата рождения"

# Удалим комментарий из строки
dob = re.sub(r'#.*$', "", born)
print("Дата рождения:", dob)

# Заменим дефисы на точки
f_dob = re.sub(r'-', ".", born)    
print(f_dob)

Запускаем скрипт и получаем вывод:

Дата рождения: 05-03-1987 
05.03.1987 # Дата рождения

Модификаторы регулярных выражений: flags

Функции регулярных выражений включают необязательный модификатор для управления изменения условий поиска. Модификаторы задают в необязательном параметре flags. Несколько модификаторов задают с помощью побитового ИЛИ (|), как показано в примерах выше.

Модификатор & Описание
1re.I — делает поиск нечувствительным к регистру
2re.L — ищет слова в соответствии с текущим языком. Эта интерпретация затрагивает алфавитную группу (\w и \W), а также поведение границы слова (\b и \B).
3re.M — символ $ выполняет поиск в конце любой строки текста (не только конце текста) и символ ^ выполняет поиск в начале любой строки текста (не только в начале текста).
4re.S — изменяет значение точки (.) на совпадение с любым символом, включая новую строку
5re.U— интерпретирует буквы в соответствии с набором символов Unicode. Этот флаг влияет на поведение \w, \W, \b, \B. В python 3+ этот флаг установлен по умолчанию.
6re.X— позволяет многострочный синтаксис регулярного выражения. Он игнорирует пробелы внутри паттерна (за исключением пробелов внутри набора [] или при экранировании обратным слешем) и обрабатывает не экранированный “#” как комментарий.

Шаблоны регулярных выражений

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

В таблицах ниже описаны все символы и комбинации символов для регулярных выражений, которые доступны в Python:

Шаблон & Описание
1^ — соответствует началу строки.
2$— соответствует концу строки.
3. — соответствует любому символу, кроме новой строки. Использование флага re.M позволяет также соответствовать новой строке.
4[4fw] — соответствует любому из символов в скобках.
5[^4fw] — соответствует любому символу, кроме тех, что в квадратных скобках.
6foo* — соответствует 0 или более вхождений “foo”.
7bar+ —- соответствует 1 или более вхождениям “bar”.
8foo? —- соответствует 0 или 1 вхождению “foo”.
9bar{3} —- соответствует трем подряд вхождениям “bar”.
10foo{3,} — соответствует 3 или более вхождениям “foo”.
11bar{2,5} —- соответствует от 2 до 5 вхождениям “bar”.
12a|b — соответствует либо a, либо b.
13(foo) — группирует регулярные выражения.
14(?imx) — временно включает параметры i, m или x в регулярное выражение. Если используются круглые скобки — затрагивается только эта область.
15(?-imx) — временно отключает опции i, m или x в регулярном выражении. Если используются круглые скобки — затрагивается только эта область.
16(?: foo) — Группирует регулярные выражения без сохранения совпадающего текста.
17(?imx: re) — Временно включает параметры i, m или x в круглых скобках.
18(?-imx: re) — временно отключает опции i, m или x в круглых скобках.
19(?#…) — комментарий.
20(?= foo) — совпадает со всеми словами после которых » foo».
21(?! foo) — совпадает со всеми словами после которых нет » foo».
22(?> foo) — совпадает со всеми словами перед которыми » foo».
23\w — совпадает с буквенным символом.
24\W — совпадает с не буквенным символом.
25\s — совпадает с пробельными символами (\t, \n, \r, \f и пробелом).
26\S — все кроме пробельных символов.
27\d — соответствует цифрам (0-9).
28\D — все кроме цифры.
29\A — соответствует началу строки.
30\Z – соответствует концу строки. Включая перевод на новую строку, если такая есть.
31\z — соответствует концу строки.
32\G — соответствует месту, где закончилось последнее соответствие.
33\b — соответствует границам слов, когда поставлены внешние скобки.
34\B — все кроме границы слова.
35**\n,\t,\r,\f ** — соответствует новым строкам, подстрокам.
36\1…\9 — соответствует подгруппе n-й группы.
37\10 — соответсвуйет номеру группы. В противном случае относится к восьмеричному представлению символьного кода.

Примеры регулярных выражений

Поиск по буквам

python – находит “python”. |

Поиск по наборам символов

Паттерн & Результаты
1[Pp]ython соответствует “Python” и “python”
2rub[ye] соответствует “ruby” и “rube”
3[aeiou] Соответствует любой гласной нижнего регистра английского алфавита ([ауоыиэяюёе] для русского)
4[0-9] соответствует любой цифре; так же как и [0123456789]
5[a-z] соответствует любой строчной букве ASCII (для кириллицы [а-яё])
6[A-Z] соответствует любой прописной букве ASCII (для кириллицы [А-ЯЁ])
7[a-zA-Z0-9] соответствует всем цифрам и буквам
8[^aeiou] соответствует всем символам, кроме строчной гласной
9[^0-9] Соответствует всем символам, кроме цифр

Специальные классы символов

Пример & Описание
1. соответствует любому символу, кроме символа новой строки
2\d соответствует цифрам: [0-9]
3\D не соответствует цифрам: [^0-9]
4\s соответствует пробельным символам: [\t\r\n\f]
5\S не соответствует пробельным символам: [^ \t\r\n\f]
6\w соответствует одному из буквенных символов: [A-Za-z0-9_]
7\W не соответствует ни одному из буквенных символов: [^A-Za-z0-9_]

Случаи повторения

Примеры
1ruby? совпадает с “rub” и “ruby”: “y” необязателен
2ruby* совпадает с “rub” и “rubyyyyy”: “y” необязателен и может повторятся несколько раз
3ruby+ совпадает с “ruby”: “y” обязателен
4\d{3} совпадает с тремя цифрами подряд
5\d{3,} совпадает с тремя и более цифрами подряд
6\d{3,5} совпадает с 3,4,5 цифрами подряд

Жадный поиск

Пример & Описание
1<.*> Жадное повторение: соответствует “perl>”
2<.*?> Ленивый поиск: соответствует “” в “perl>”

Группирование со скобками

Пример & Описание
1\D\d+ Нет группы: + относится только к \d
2(\D\d)+ Группа: + относится к паре \D\d
3([Pp]ython(, )?)+ соответствует “Python”, “Python, python, python”.

Ссылки на группы

Пример & Описание
1([Pp])ython&\1ails совпадает с python&pails и Python&Pails
2([’»])[^\1]*\1 Строка с одним или двумя кавычками. \1 соответствует 1-й группе. \2 соответствует второй группе и т. д.

Или

Пример & Описание
1python|perl соответствует “python” или “perl”
2rub(y|le)) соответствует “ruby” или “ruble”
3Python(!+|?) после «Python» следует 1 и более “!” или один “?”

Границы слов и строк

Пример & Описание
1^Python соответствует “Python” в начале текста или новой строки текста.
2Python$ соответствует “Python” в конце текста или строки текста.
3\APython соответствует “Python” в начале текста
4Python\Z соответствует “Python” в конце текста
5\bPython\b соответствует “Python” как отдельному слову
6\brub\B соответствует «rub» в начале слова: «rube» и «ruby».
7Python(?=!) соответствует “Python”, если за ним следует восклицательный знак.
8Python(?!!) соответствует “Python”, если за ним не следует восклицательный знак

Специальный синтаксис в группах

Пример & Описание
1R(?#comment) соответствует «R». Все, что следует дальше — комментарий
2R(?i)uby нечувствительный к регистру при поиске “uby”
3R(?i:uby) аналогично указанному выше
4rub(?:y le)) группируется только без создания обратной ссылки (\1)