Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Python

Регулярные выражения в Python: практическое руководство

Введение

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

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

Мы рассмотрим две важные функции для работы с регулярными выражениями. Но сначала небольшое замечание: существуют различные символы, имеющие специальное значение в регулярных выражениях. Чтобы избежать путаницы, будем использовать «сырые» строки (raw strings) в виде r'выражение'.

Функция match

Функция пытается сопоставить шаблон pattern со string с опциональными flags.

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

Параметры:

№Параметр и описание
1pattern — регулярное выражение для сопоставления.
2string — строка, в которой ищется совпадение с шаблоном в начале строки.
3flags — модификаторы, задаются через побитовое ИЛИ (|). Перечислены в таблице ниже.

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

№Метод объекта match и описание
1group(num=0) — возвращает всё совпадение (или конкретную подгруппу num).
2groups() — возвращает все совпавшие подгруппы в кортеже (пустой, если их не было).

Пример

#!/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

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

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

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

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

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

Таблица синтаксиса, доступного в Python:

№Шаблон и описание
1^ — начало строки.
2$ — конец строки.
3. — любой одиночный символ, кроме новой строки. С опцией m — и новую строку.
4[...] — любой одиночный символ в скобках.
5[^...] — любой одиночный символ, НЕ в скобках.
6re* — 0 или более вхождений предшествующего выражения.
7re+ — 1 или более вхождений.
8re? — 0 или 1 вхождение.
9re{n} — ровно n вхождений.
10re{n,} — n или более вхождений.
11re{n,m} — от n до m вхождений.
12a|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-я подгруппа, если уже совпала. Иначе — восьмеричный код символа.

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

Буквальные символы

№Пример и описание
1python — соответствует "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" плюс 0 или более y
3ruby+ — "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-й и т.д.

Альтернативы

№Пример и описание
1python|perl — "python" или "perl"
2rub(y|le) — "ruby" или "ruble"
3Python(!+|\?) — "Python" с одним или более ! или одним ?

Якоря (Anchors)

Указание позиции совпадения:

№Пример и описание
1^Python — "Python" в начале строки или внутренней линии
2Python$ — "Python" в конце строки или линии
3\APython — "Python" в начале строки
4Python\Z — "Python" в конце строки
5\bPython\b — "Python" на границе слова
6\brub\B — \B не-граница: "rub" в "rube" и "ruby", но не отдельно
7Python(?=!) — "Python", если за ним следует !
8Python(?!\!) — "Python", если за ним НЕ следует !

Специальный синтаксис со скобками

№Пример и описание
1R(?#comment) — соответствует "R". Остальное — комментарий
2R(?i)uby — регистронезависимо при сопоставлении "uby"
3R(?i:uby) — то же самое
4rub(?:y|le) — группировка без создания \1 обратной ссылки

Python

  1. Освоение типов данных в Python: практическое руководство
  2. Мастерство операторов Python: Полное руководство
  3. Оператор pass в Python: практическое руководство
  4. Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
  5. Словари в Python: создание, манипуляции и продвинутые техники
  6. Итераторы в Python: как они работают и как создать свои
  7. Замыкания в Python: как вложенные функции захватывают переменные
  8. Регулярные выражения в Python (модуль re) — практическое руководство
  9. Модуль datetime в Python: практическое руководство по датам, времени и часовым поясам
  10. Регулярные выражения в Java: Мастерство сопоставления шаблонов с java.util.regex