Регулярные выражения в Python: практическое руководство
Введение
Регулярное выражение — это специальная последовательность символов, помогающая находить или сопоставлять другие строки или наборы строк с использованием специализированного синтаксиса, заданного в шаблоне. Регулярные выражения широко используются в мире UNIX.
Модуль Python re обеспечивает полную поддержку регулярных выражений в стиле Perl. Модуль re возбуждает исключение re.error, если при компиляции или использовании регулярного выражения возникает ошибка.
Мы рассмотрим две важные функции для работы с регулярными выражениями. Но сначала небольшое замечание: существуют различные символы, имеющие специальное значение в регулярных выражениях. Чтобы избежать путаницы, будем использовать «сырые» строки (raw strings) в виде r'выражение'.
Функция match
Функция пытается сопоставить шаблон pattern со string с опциональными flags.
re.match(pattern, string, flags=0)
Параметры:
| № | Параметр и описание |
|---|---|
| 1 | pattern — регулярное выражение для сопоставления. |
| 2 | string — строка, в которой ищется совпадение с шаблоном в начале строки. |
| 3 | flags — модификаторы, задаются через побитовое ИЛИ (|). Перечислены в таблице ниже. |
Функция re.match возвращает объект match при успехе, None при неудаче. Используем group(num) или groups() объекта match для получения совпавшего выражения.
| № | Метод объекта match и описание |
|---|---|
| 1 | group(num=0) — возвращает всё совпадение (или конкретную подгруппу num). |
| 2 | groups() — возвращает все совпавшие подгруппы в кортеже (пустой, если их не было). |
Пример
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print("matchObj.group() : ", matchObj.group())
print("matchObj.group(1) : ", matchObj.group(1))
print("matchObj.group(2) : ", matchObj.group(2))
else:
print("No match!!")
Результат:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Функция search
Функция ищет первое вхождение шаблона pattern в string с опциональными flags.
re.search(pattern, string, flags=0)
Параметры: аналогичны match, но поиск ведется в любом месте строки.
Возвращает объект match при успехе, None при неудаче. Методы group() и groups() работают так же.
Пример
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
searchObj = re.search(r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print("searchObj.group() : ", searchObj.group())
print("searchObj.group(1) : ", searchObj.group(1))
print("searchObj.group(2) : ", searchObj.group(2))
else:
print("Nothing found!!")
Результат:
searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter
Сопоставление (match) против поиска (search)
Python предлагает две примитивные операции на основе регулярных выражений: match проверяет совпадение только в начале строки, а search — в любом месте строки (это поведение Perl по умолчанию).
Пример
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match(r'dogs', line, re.M|re.I)
if matchObj:
print("match --> matchObj.group() : ", matchObj.group())
else:
print("No match!!")
searchObj = re.search(r'dogs', line, re.M|re.I)
if searchObj:
print("search --> searchObj.group() : ", searchObj.group())
else:
print("Nothing found!!")
Результат:
No match!!
search --> searchObj.group() : dogs
Поиск и замена
Один из важнейших методов модуля re — sub.
re.sub(pattern, repl, string, max=0)
Метод заменяет все вхождения шаблона pattern в string на repl, заменяя все, если не задан max. Возвращает измененную строку.
Пример
#!/usr/bin/python
import re
phone = "2004-959-559 # This is Phone Number"
# Удалить комментарии в стиле Python
num = re.sub(r'#.*$', "", phone)
print("Phone Num : ", num)
# Удалить всё, кроме цифр
num = re.sub(r'\D', "", phone)
print("Phone Num : ", num)
Результат:
Phone Num : 2004-959-559
Phone Num : 2004959559
Модификаторы регулярных выражений: флаги опций
Регулярные выражения могут включать опциональный модификатор для управления аспектами сопоставления. Модификаторы задаются как опциональный флаг. Можно комбинировать несколько через исключающее ИЛИ (|).
| № | Модификатор и описание |
|---|---|
| 1 | re.I — регистронезависимое сопоставление. |
| 2 | re.L — интерпретация слов согласно текущей локали. Влияет на \w, \W, \b, \B. |
| 3 | re.M — $ соответствует концу строки (не только конца строки), ^ — началу любой строки. |
| 4 | re.S — точка соответствует любому символу, включая перевод строки. |
| 5 | re.U — интерпретация букв согласно Unicode. Влияет на \w, \W, \b, \B. |
| 6 | re.X — разрешает «красивый» синтаксис: игнорирует пробелы (кроме внутри [] или экранированных) и считает неэкранированный # комментарием. |
Шаблоны регулярных выражений
За исключением управляющих символов (+ ? . * ^ $ ( ) [ ] { } | \), все символы соответствуют сами себе. Управляющий символ можно экранировать обратным слэшем.
Таблица синтаксиса, доступного в Python:
| № | Шаблон и описание |
|---|---|
| 1 | ^ — начало строки. |
| 2 | $ — конец строки. |
| 3 | . — любой одиночный символ, кроме новой строки. С опцией m — и новую строку. |
| 4 | [...] — любой одиночный символ в скобках. |
| 5 | [^...] — любой одиночный символ, НЕ в скобках. |
| 6 | re* — 0 или более вхождений предшествующего выражения. |
| 7 | re+ — 1 или более вхождений. |
| 8 | re? — 0 или 1 вхождение. |
| 9 | re{n} — ровно n вхождений. |
| 10 | re{n,} — n или более вхождений. |
| 11 | re{n,m} — от n до m вхождений. |
| 12 | a|b — a или b. |
| 13 | (re) — группировка и запоминание совпавшего текста. |
| 14 | (?imx) — временно включает i, m, x внутри выражения. В скобках — только эта область. |
| 15 | (?-imx) — временно выключает i, m, x. |
| 16 | (?:re) — группировка без запоминания. |
| 17 | (?imx:re) — временно включает опции в скобках. |
| 18 | (?-imx:re) — временно выключает опции в скобках. |
| 19 | (?#...) — комментарий. |
| 20 | (?=re) — позиция по шаблону (positive lookahead). Без диапазона. |
| 21 | (?!re) — позиция по отрицанию шаблона (negative lookahead). |
| 22 | (?>re) — независимый шаблон без отката (atomic group). |
| 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 — граница слова (вне скобок). Backspace (0x08) внутри скобок. |
| 34 | \B — не-граница слова. |
| 35 | \n, \t, etc. — новая строка, табуляция и т.д. |
| 36 | \1...\9 — n-я сгруппированная подвыражение. |
| 37 | \10 — n-я подгруппа, если уже совпала. Иначе — восьмеричный код символа. |
Примеры регулярных выражений
Буквальные символы
| № | Пример и описание |
|---|---|
| 1 | python — соответствует "python". |
Классы символов
| № | Пример и описание |
|---|---|
| 1 | [Pp]ython — "Python" или "python" |
| 2 | rub[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_] |
Повторения
| № | Пример и описание |
|---|---|
| 1 | ruby? — "rub" или "ruby": y опционален |
| 2 | ruby* — "rub" плюс 0 или более y |
| 3 | ruby+ — "rub" плюс 1 или более y |
| 4 | \d{3} — ровно 3 цифры |
| 5 | \d{3,} — 3 или более цифр |
| 6 | \d{3,5} — 3, 4 или 5 цифр |
Нежадные повторения
Сопоставляют наименьшее число повторений:
| № | Пример и описание |
|---|---|
| 1 | <.*> — жадное: соответствует "<python>perl>" |
| 2 | <.*?> — нежадное: соответствует "<python>" в "<python>perl>" |
Группировка скобками
| № | Пример и описание |
|---|---|
| 1 | \D\d+ — без группы: + повторяет \d |
| 2 | (\D\d)+ — с группировкой: + повторяет пару \D\d |
| 3 | ([Pp]ython(, )?)+ — "Python", "Python, python, python" и т.д. |
Обратные ссылки (Backreferences)
Совпадают с ранее совпавшей группой:
| № | Пример и описание |
|---|---|
| 1 | ([Pp])ython&\1ails — "python&pails" или "Python&Pails" |
| 2 | (['"])[^\1]*\1 — строка в одинарных или двойных кавычках. \1 совпадает с тем, что совпала 1-я группа. \2 — со 2-й и т.д. |
Альтернативы
| № | Пример и описание |
|---|---|
| 1 | python|perl — "python" или "perl" |
| 2 | rub(y|le) — "ruby" или "ruble" |
| 3 | Python(!+|\?) — "Python" с одним или более ! или одним ? |
Якоря (Anchors)
Указание позиции совпадения:
| № | Пример и описание |
|---|---|
| 1 | ^Python — "Python" в начале строки или внутренней линии |
| 2 | Python$ — "Python" в конце строки или линии |
| 3 | \APython — "Python" в начале строки |
| 4 | Python\Z — "Python" в конце строки |
| 5 | \bPython\b — "Python" на границе слова |
| 6 | \brub\B — \B не-граница: "rub" в "rube" и "ruby", но не отдельно |
| 7 | Python(?=!) — "Python", если за ним следует ! |
| 8 | Python(?!\!) — "Python", если за ним НЕ следует ! |
Специальный синтаксис со скобками
| № | Пример и описание |
|---|---|
| 1 | R(?#comment) — соответствует "R". Остальное — комментарий |
| 2 | R(?i)uby — регистронезависимо при сопоставлении "uby" |
| 3 | R(?i:uby) — то же самое |
| 4 | rub(?:y|le) — группировка без создания \1 обратной ссылки |
Python
- Освоение типов данных в Python: практическое руководство
- Мастерство операторов Python: Полное руководство
- Оператор pass в Python: практическое руководство
- Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
- Словари в Python: создание, манипуляции и продвинутые техники
- Итераторы в Python: как они работают и как создать свои
- Замыкания в Python: как вложенные функции захватывают переменные
- Регулярные выражения в Python (модуль re) — практическое руководство
- Модуль datetime в Python: практическое руководство по датам, времени и часовым поясам
- Регулярные выражения в Java: Мастерство сопоставления шаблонов с java.util.regex