Python 3 — Регулярные выражения

Регулярное выражение — это специальная последовательность символов, которая позволяет соответствовать или найти другие строки или наборы строк, используя специализированный синтаксис проведен в шаблоне. Регулярные выражения широко используются в мире UNIX.
Модуль re обеспечивает полную поддержку Perl-подобных регулярных выражений в Python. Модуль re вызывает исключение re.error, если произошла ошибка во время компиляции или с помощью регулярного выражения.
Мы охватим две важные функции, которые будут использоваться для обработки регулярных выражений. Тем не менее, одна небольшая вещь: Есть различные символы, которые будут иметь особое значение, когда они используются в регулярном выражении. Во избежание путаницы при работе с регулярными выражениями, мы будем использовать строки Raw как r’expression’.
Основные модели, которые соответствуют одиночным символам
| № | Выражение & Соответствие |
|---|---|
| 1 | a, X, 9, < — обычные символы просто соответствуют сами себе точно. |
| 2 | . (a period) — соответствует любому символу, за исключением символа новой строки «\n» |
| 3 | \w — соответствует символу «слово»: букве или цифры или подчеркиванию [A-Za-z0-9_]. |
| 4 | \W — соответствует любому символу, кроме буквы. |
| 5 | \b — граница между словом и несловообразующим |
| 6 | \s — соответствует одному символу пробела — пробел, перевод строки, возврат, вкладка |
| 7 | \S — соответствует любому символу. |
| 8 | \t, \n, \r — табуляции, новая строка, возврат |
| 9 | \d — десятичная цифра [0-9] |
| 10 | ^ — соответствует началу строки |
| 11 | $ — соответствует концу строки |
| 12 | \ — блокирует «особость» символа. |
Флаги компиляции
Флаги компиляции позволяют изменить некоторые аспекты того, как работают регулярные выражения. Флаги доступны в модуле re под двумя именами, длинное имя, например, как IGNORECASE и короткое, в одно-буквенном виде, такие как I.
| № | Флаг и Значение |
|---|---|
| 1 | ASCII, A — Делает несколько побегов, как \w, \b, \s и \d. Сравнение только для ASCII символов с соответствующим свойством. |
| 2 | DOTALL, S — Сделает, соответствует любому символу, включая символ новой строки |
| 3 | IGNORECASE, I — Сравнение регистронезависимых символов |
| 4 | LOCALE, L — Локальное сравнение |
| 5 | MULTILINE, M — Сравнение многострочных, используя ^ и $ |
| 6 | VERBOSE, X (for ‘extended’) — Включить многословные REs, которые могут быть организованы более чисто и понятно |
Функция match
Эта функция пытается соответствовать RE pattern для string с дополнительными flags.
Синтаксис этой функции:
re.match(pattern, string, flags = 0)
Вот описание параметров:
| № | Параметр & Описание |
|---|---|
| 1 | pattern — Это регулярное выражение, которому необходимо соответствовать. |
| 2 | string — Это строка, которая будет искать, чтобы соответствовать шаблону в начале строки. |
| 3 | flags — Вы можете задать различные флаги с помощью побитового OR (|). Это модификаторы, которые перечислены в таблице ниже. |
Функция Re.match возвращает объект match если успех, и None если провал. Мы используем функции usegroup(num) или groups() объекта match, чтобы получить согласованное выражение.
| № | Метод соответствия объекта и описание |
|---|---|
| 1 | group(num = 0) — Этот метод возвращает все сравнения (или конкретную подгруппу num) |
| 2 | groups() — Этот метод возвращает все соответствующие подгруппы в кортеже (пусто, если не найдено) |
Пример
#!/usr/bin/python3
import re
line = "Кошки умнее собак"
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 ("Нет совпадения!!")
Когда этот код выполнится, он выведет следующий результат:
matchObj.group() : Кошки умнее собак matchObj.group(1) : Кошки matchObj.group(2) : умнее
Функция search
Эта функция ищет первое вхождение pattern re в string с дополнительными flags.
Синтаксис этой функции:
re.search(pattern, string, flags = 0)
Вот описание параметров:
| № | Параметр & Описание |
|---|---|
| 1 | pattern — Это регулярное выражение, которому необходимо соответствовать. |
| 2 | string — Это строка, которая будет искать, чтобы соответствовать шаблону в любом месте строки. |
| 3 | flags — Вы можете задать различные флаги с помощью побитового OR (|). Эти модификаторы, которые перечислены в таблице ниже. |
Функция Re.search возвращает объект match если успех, и None если провал. Мы используем функцию group(num) или groups() объекта match, чтобы получить совпадающее выражение.
| № | Метод соответствия объекта и описание |
|---|---|
| 1 | group(num = 0) — Этот метод возвращает все сравнения (или конкретную подгруппу num) |
| 2 | groups() — Этот метод возвращает все соответствующие подгруппе в кортеже (пусто, если не найдено) |
Пример
#!/usr/bin/python3
import re
line = "Кошки умнее собак";
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 ("Ничего не найдено!!")
Когда этот код выполнится, он выведет следующий результат:
matchObj.group() : Кошки умнее собак matchObj.group(1) : Кошки matchObj.group(2) : умнее
Соответствие поиску версий
Python предлагает две различные примитивные операции, основанные на регулярных выражениях: match проверка на сравнение только в начале строки, в то время как search проверка на сравнение где — нибудь в строке (это то, что Perl делает по умолчанию).
Пример
#!/usr/bin/python3
import re
line = "Кошки умнее собак";
matchObj = re.match( r'собак', line, re.M|re.I)
if matchObj:
print ("match --> matchObj.group() : ", matchObj.group())
else:
print ("Нет совпадения!!")
searchObj = re.search( r'собак', line, re.M|re.I)
if searchObj:
print ("search --> searchObj.group() : ", searchObj.group())
else:
print ("Ничего не найдено!!")
Когда этот код выполнится, он выведет следующий результат:
Нет совпадения!! search --> matchObj.group() : собак
Поиск и замена
Одним из наиболее важных методов re, которые используют регулярные выражения является sub.
Синтаксис
re.sub(pattern, repl, string, max=0)
Этот метод заменяет все вхождения RE pattern в string на repl, заменив все вхождения, если max не предусмотрен. Этот метод возвращает модифицированную строку.
Пример
#!/usr/bin/python3
import re
phone = "2004-959-559 # Это номер телефона"
# Удаление комментариев в стиле Python
num = re.sub(r'#.*$', "", phone)
print ("Номер телефона : ", num)
# Удалить все, кроме цифр
num = re.sub(r'\D', "", phone)
print ("Номер телефона : ", num)
Когда этот код выполнится, он выведет следующий результат:
Номер телефона : 2004-959-559 Номер телефона : 2004959559
Модификаторы регулярных выражений: Вариант flag
Регулярное выражение константы могут включать в себя необязательный модификатор для управления различными аспектами сравнения. Модификаторы указаны в качестве дополнительного флага. Вы можете предоставить несколько модификаторов с помощью исключающего OR (|), как показано выше, и может быть представлена одним из следующих:
| № | Модификатор & Описание |
|---|---|
| 1 | re.I — Выполняет регистронезависимое согласование. |
| 2 | re.L — Интерпретирует слова в соответствии с текущей локализацией. Эта интерпретация влияет на алфавитную группу (\w и \W), а также слово граничное поведение (\b и \В). |
| 3 | re.M — Заставляет $ соответствует концу строки (а не только конец строки) и делает ^ совпадать с началом любой строки (а не только в начале строки). |
| 4 | re.S — Делает период (точка) соответствовать любому символу, включая символ новой строки. |
| 5 | re.U — Интерпретирует буквы в соответствии с набором символов Юникода. Этот флаг влияет на поведение \w, \W, \b, \B. |
| 6 | re.X — Разрешает «cuter» синтаксис регулярных выражений. Он игнорирует пробелы (за исключением внутри множества [] или при замаскированой обратной косой чертой) и рассматривает неэкранированный # как маркер комментарий. |
Шаблоны регулярных выражений
За исключением управляющих символов, (+ ? . * ^ $ ( ) [ ] { } | \), все символы совпадают сами. Вы можете избежать управляющего символа, предварив его с обратной косой чертой.
В следующей таблице перечислен синтаксис регулярных выражений, который доступен в Python:
Примеры регулярных выражений
Буквенные символы
| № | Пример & Описание |
|---|---|
| 1 | python — Сравнение «python». |
Классы символов
| № | Пример & Описание |
|---|---|
| 1 | [Рр]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»: у — необязательно |
| 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 | <.*> — Жадное повторение: matches «<python>Perl>» |
| 2 | <.*?> — Из жадного в нежадный: matches «<python>» в «<python>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 — Сравнение, что во 2-й группе соответствовал, и т. д. |
Альтернативы
| № | Пример & Описание |
|---|---|
| 1 | python|perl — Сравнение «python» или «perl» |
| 2 | rub(y|le) — Сравнение «ruby» или «ruble» |
| 3 | Python(!+|\?) — «Python», а затем один или более! или один? |
Якоря
Необходимо для определения позиции соответствия.
| № | Пример & Описание |
|---|---|
| 1 | ^Python — Сравнение «Python» в начале строки или внутренней линии |
| 2 | Python$ — Сравнение «Python» в конце строки или строки |
| 3 | \APython — Сравнение «Python» в начале строки |
| 4 | Python\Z — Сравнение «Python» в конце строки |
| 5 | \bPython\b — Сравнение «Python» на границе слова |
| 6 | \brub\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 |