Регулярные выражения Python
Регулярное выражение — это специальная последовательность символов, которая помогает легко проверить, соответствует ли строка определённому шаблону.
Начиная с версии 1.5, Python добавил модуль re, который предоставляет шаблоны регулярных выражений в стиле Perl.
Модуль re предоставляет языку Python все возможности регулярных выражений.
Функция compile создаёт объект регулярного выражения на основе строки шаблона и необязательных параметров-флагов. Этот объект имеет ряд методов для сопоставления и замены регулярных выражений.
Модуль re также предоставляет функции, полностью соответствующие функциональности этих методов. Эти функции используют строку шаблона в качестве первого параметра.
В этой главе в основном рассматриваются часто используемые функции обработки регулярных выражений в Python.
Функция re.match
re.match пытается сопоставить шаблон с началом строки. Если сопоставление с начальной позиции не удалось, match() возвращает None.
Синтаксис функции:
re.match(pattern, string, flags=0)
Описание параметров функции:
| Параметр | Описание |
|---|---|
| pattern | Регулярное выражение для сопоставления. |
| string | Строка, которую нужно сопоставить. |
| флаги | Флаги, используемые для управления способом сопоставления регулярного выражения, например: учёт регистра, многострочное сопоставление и т. д. См.:Модификаторы регулярных выражений — необязательные флаги |
Если сопоставление успешно, метод re.match возвращает объект соответствия, в противном случае он возвращает None.
Мы можем использовать функции group(num) или groups() объекта соответствия, чтобы получить совпавшее выражение.
| Методы объекта соответствия | Описание |
|---|---|
| group(num=0) | Строка всего совпавшего выражения. group() может принимать несколько номеров групп одновременно, и в этом случае возвращает кортеж, содержащий значения, соответствующие этим группам. |
| groups() | Возвращает кортеж, содержащий все строки подгрупп, от 1 до количества содержащихся подгрупп. |
Пример
Вывод приведенного выше примера:
(0, 3) None
Пример
Результат вышеприведенного примера следующий:
matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter
метод re.search
re.search сканирует всю строку и возвращает первое успешное совпадение.
Синтаксис функции:
re.search(pattern, string, flags=0)
Описание параметров функции:
| Параметр | Описание |
|---|---|
| pattern | Регулярное выражение для сопоставления. |
| string | Строка, которую нужно сопоставить. |
| флаги | Флаги, используемые для управления методом сопоставления регулярного выражения, например: чувствительность к регистру, многострочное сопоставление и т. д. |
Если совпадение успешно, метод re.search возвращает объект match, иначе он возвращает None.
Мы можем использовать функции group(num) или groups() объекта соответствия, чтобы получить совпавшее выражение.
| Методы объекта соответствия | Описание |
|---|---|
| group(num=0) | Строка всего совпавшего выражения. group() может принимать несколько номеров групп одновременно, и в этом случае возвращает кортеж, содержащий значения, соответствующие этим группам. |
| groups() | Возвращает кортеж, содержащий все строки подгрупп, от 1 до количества содержащихся подгрупп. |
Пример
Вывод приведенного выше примера:
(0, 3) (11, 14)
Пример
searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter
Разница между re.match и re.search
re.match сопоставляет только начало строки. Если начало строки не соответствует регулярному выражению, сопоставление завершается неудачно, и функция возвращает None; в то время как re.search сопоставляет всю строку, пока не будет найдено совпадение.
Пример
No match!! search --> searchObj.group() : dogs
Поиск и замена
Модуль re в Python предоставляет re.sub для замены совпадений в строке.
Синтаксис:
re.sub(pattern, repl, string, count=0, flags=0)
Параметры:
- pattern: строка шаблона в регулярном выражении.
- repl: строка замены, также может быть функцией.
- string: исходная строка для поиска и замены.
- count: максимальное количество замен после сопоставления с шаблоном; по умолчанию 0 означает заменить все совпадения.
Пример
电话号码是: 2004-959-559 电话号码是 : 2004959559
Параметр repl является функцией
В следующем примере совпавшие в строке числа умножаются на 2:
Пример
Вывод после выполнения:
A46G8HFD1134
функция re.compile
Функция compile используется для компиляции регулярного выражения и создания объекта регулярного выражения (Pattern), который может использоваться такими функциями, как match(), search() и findall().
Формат синтаксиса:
re.compile(pattern[, flags])
Параметры:
-
pattern: Регулярное выражение в виде строки
-
flags: Необязательный параметр, задаёт режим сопоставления, например игнорирование регистра, многострочный режим и т. д. Конкретные параметры:
- re.IИгнорировать регистр
- re.LУказывает, что специальные наборы символов \w, \W, \b, \B, \s, \S зависят от текущего окружения
- re.MМногострочный режим
- re.SТо есть.и любой символ, включая перевод строки (.исключая перевод строки)
- re.UУказывает, что специальные наборы символов \w, \W, \b, \B, \d, \D, \s, \S зависят от базы данных свойств символов Unicode
- re.XДля повышения читаемости игнорировать пробелы и#комментарии после
Пример
Пример
Выше, при успешном сопоставлении, возвращается объект Match, где:
group([group1, …])Метод используется для получения строки, сопоставленной одной или несколькими группами. Когда вы хотите получить всю сопоставленную подстроку, можно напрямую использоватьgroup()илиgroup(0);start([group])Метод используется для получения начальной позиции подстроки, сопоставленной группой, во всей строке (индекса первого символа подстроки), со значением параметра по умолчанию 0;end([group])Метод используется для получения конечной позиции подстроки, сопоставленной группой, во всей строке (индекса последнего символа подстроки + 1), со значением параметра по умолчанию 0;span([group])Метод возвращает(start(group), end(group))。
Давайте рассмотрим другой пример:
Пример
findall
Находит все подстроки, соответствующие регулярному выражению в строке, и возвращает список. Если совпадает несколько шаблонов, возвращает список кортежей. Если совпадений не найдено, возвращает пустой список.
Примечание:match и search выполняют сопоставление один раз, тогда как findall сопоставляет все.
Формат синтаксиса:
findall(string[, pos[, endpos]])
Параметры:
- string: строка для сопоставления.
- pos: необязательный параметр, задаёт начальную позицию строки, по умолчанию 0.
- endpos: необязательный параметр, задаёт конечную позицию строки, по умолчанию равна длине строки.
Найдите все числа в строке:
Пример
Результат вывода:
['123', '456'] ['88', '12']
При нескольких совпадающих шаблонах возвращает список кортежей:
Пример
result = re.findall(r'(\w+)=(\d+)', 'set width=20 and height=10')
print(result)
[('width', '20'), ('height', '10')]
re.finditer
Подобно findall, находит все подстроки в строке, совпадающие с регулярным выражением, и возвращает их в виде итератора.
re.finditer(pattern, string, flags=0)
Параметры:
| Параметр | Описание |
|---|---|
| pattern | Регулярное выражение для сопоставления. |
| string | Строка, которую нужно сопоставить. |
| флаги | Флаги, используемые для управления поведением сопоставления регулярного выражения, например, учет регистра, многострочное сопоставление и т. д. См.:Модификаторы регулярных выражений — необязательные флаги |
Пример
Результат вывода:
12 32 43 3
re.split
Метод split разбивает строку по подстрокам, которые могут быть сопоставлены, и возвращает список. Его использование выглядит следующим образом:
re.split(pattern, string[, maxsplit=0, flags=0])
Параметры:
| Параметр | Описание |
|---|---|
| pattern | Регулярное выражение для сопоставления. |
| string | Строка, которую нужно сопоставить. |
| maxsplit | Максимальное количество разбиений. maxsplit=1 означает разбить один раз. По умолчанию 0, что означает отсутствие ограничений. |
| флаги | Флаги, используемые для управления поведением сопоставления регулярного выражения, например, учет регистра, многострочное сопоставление и т. д. См.:Модификаторы регулярных выражений — необязательные флаги |
Пример
Объект регулярного выражения
re.RegexObject
re.compile() возвращает объект RegexObject.
re.MatchObject
group() возвращает строку, совпавшую с регулярным выражением.
- start()Возвращает начальную позицию совпадения
- end()Возвращает конечную позицию совпадения
- span()Возвращает кортеж, содержащий позиции (start, end) совпадения
Модификаторы регулярных выражений — необязательные флаги
Регулярные выражения могут содержать необязательные модификаторы-флаги для управления шаблоном сопоставления. Модификаторы указываются как необязательный флаг. Несколько флагов можно задать, объединив их побитовым OR (|). Например, re.I | re.M устанавливает оба флага I и M:
| Модификатор | Описание |
|---|---|
| re.I | Делает сопоставление нечувствительным к регистру |
| re.L | Выполняет сопоставление с учётом локали |
| re.M | Многострочное сопоставление, влияет на ^ и $ |
| re.S | Делает так, что . соответствует всем символам, включая перевод строки |
| re.U | Разбирает символы в соответствии с набором символов Unicode. Этот флаг влияет на \w, \W, \b, \B. |
| re.X | Этот флаг даёт более гибкий формат, позволяющий писать регулярные выражения, которые легче понимать. |
Шаблоны регулярных выражений
Строки шаблонов используют специальный синтаксис для представления регулярного выражения:
Буквы и цифры представляют сами себя. Буквы и цифры в шаблоне регулярного выражения соответствуют тем же строкам.
Большинство букв и цифр имеют другое значение, если перед ними стоит обратная косая черта.
Знаки пунктуации соответствуют сами себе только при экранировании; в противном случае они обозначают специальные значения.
Сам символ обратной косой черты нужно экранировать обратной косой чертой.
Поскольку регулярные выражения часто содержат обратные косые черты, для их представления лучше использовать raw-строки. Элементы шаблона (такие как r'\t', эквивалентный '\\t') соответствуют соответствующим специальным символам.
В следующей таблице перечислены специальные элементы синтаксиса шаблонов регулярных выражений. Если при использовании шаблона вы указываете необязательные параметры-флаги, значение некоторых элементов шаблона может измениться.
| Паттерн | Описание |
|---|---|
| ^ | Совпадает с началом строки. |
| $ | Совпадает с концом строки. |
| . | Совпадает с любым символом, кроме символа новой строки. Если указан флаг re.DOTALL, он может совпадать с любым символом, включая символ новой строки. |
| [...] | Используется для представления набора символов, перечисленных по отдельности: [amk] совпадает с 'a', 'm' или 'k' |
| [^...] | Символы, не входящие в []: [^abc] совпадает с любым символом, кроме a, b, c. |
| re* | Совпадает с 0 или более вхождениями выражения. |
| re+ | Совпадает с 1 или более вхождениями выражения. |
| re? | Соответствует 0 или 1 вхождению фрагмента, заданного предшествующим регулярным выражением, нежадным способом |
| re{ n} | Точно соответствует n вхождениям предшествующего выражения. Например,o{2}Оно не может сопоставиться с 'o' в "Bob", но может сопоставиться с двумя 'o' в "food". |
| re{ n,} | Соответствует n или более вхождениям предшествующего выражения. Например, o{2,} не может сопоставиться с 'o' в "Bob", но может сопоставиться со всеми 'o' в "foooood". "o{1,}" эквивалентно "o+". "o{0,}" эквивалентно "o*". |
| re{ n, m} | Соответствует от n до m вхождениям фрагмента, заданного предшествующим регулярным выражением, жадным способом |
| a| b | Соответствует a или b |
| (re) | Группирует регулярное выражение и запоминает совпавший текст |
| (?imx) | Регулярное выражение содержит три необязательных флага: i, m или x. Действует только внутри круглых скобок. |
| (?-imx) | Регулярное выражение отключает необязательные флаги i, m или x. Действует только внутри круглых скобок. |
| (?: re) | Аналогично (...), но не представляет собой группу |
| (?imx: re) | Использует необязательные флаги i, m или x внутри круглых скобок |
| (?-imx: re) | Не использует необязательные флаги i, m или x внутри круглых скобок |
| (?#...) | Комментарий. |
| (?= re) | Утверждение положительного просмотра вперёд. Если содержащееся регулярное выражение, представленное ..., успешно сопоставляется в текущей позиции, то проверка проходит; в противном случае она не проходит. Но после попытки сопоставления содержащегося выражения механизм сопоставления не продвигается; остальная часть шаблона всё ещё должна проверяться справа от утверждения. |
| (?! re) | Утверждение отрицательного просмотра вперёд. Противоположно положительному утверждению; срабатывает, когда содержащееся выражение не может совпасть в текущей позиции строки. |
| (?> re) | Совпадает с независимым шаблоном, исключая перебор с возвратом. |
| \w | Совпадает с буквами, цифрами и знаками подчёркивания |
| \W | Совпадает с чем угодно, кроме букв, цифр и знаков подчёркивания |
| \s | Совпадает с любым пробельным символом, эквивалентно[ \t\n\r\f]。 |
| \S | Совпадает с любым непробельным символом |
| \d | Совпадает с любой цифрой, эквивалентно [0-9]. |
| \D | Совпадает с любым нецифровым символом |
| \A | Совпадает с началом строки |
| \Z | Совпадает с концом строки. Если есть символ новой строки, то совпадает только до конца строки перед символом новой строки. |
| \z | Совпадает с концом строки |
| \G | Совпадает с позицией, в которой завершилось последнее совпадение. |
| \b | Совпадает с границей слова, то есть с позицией между словом и пробелом. Например, 'er\b' может совпасть с 'er' в "never", но не может совпасть с 'er' в "verb". |
| \B | Совпадает с неграницей слова. 'er\B' может совпасть с 'er' в "verb", но не может совпасть с 'er' в "never". |
| \n, \t и т. д. | Совпадает с символом новой строки. Совпадает с символом табуляции. И т. д. |
| \1...\9 | Совпадает с содержимым n-й группы. |
| \10 | Совпадает с содержимым n-й группы, если она была сопоставлена. В противном случае это ссылка на восьмеричное выражение кода символа. |
Примеры регулярных выражений
Сопоставление символов
| Пример | Описание |
|---|---|
| python | Совпадает с "python". |
Классы символов
| Пример | Описание |
|---|---|
| [Pp]ython | Совпадает с "Python" или "python" |
| rub[ye] | Совпадает с "ruby" или "rube" |
| [aeiou] | Совпадает с любой одной буквой в квадратных скобках |
| [0-9] | Совпадает с любой цифрой. Аналогично |
| [a-z] | Совпадает с любой строчной буквой |
| [A-Z] | Совпадает с любой прописной буквой |
| [a-zA-Z0-9] | Совпадает с любой буквой и цифрой |
| [^aeiou] | Все символы, кроме букв aeiou |
| [^0-9] | Совпадает с символами, отличными от цифр |
Специальные классы символов
| Пример | Описание |
|---|---|
| . | Соответствует любому одиночному символу, кроме "\n". Чтобы сопоставить любой символ, включая '\n', используйте шаблон вида '[.\n]'. |
| \d | Совпадает с цифровым символом. Эквивалентно [0-9]. |
| \D | Совпадает с нецифровым символом. Эквивалентно [^0-9]. |
| \s | Совпадает с любым пробельным символом, включая пробел, табуляцию, подачу страницы и т. д. Эквивалентно [ \f\n\r\t\v]. |
| \S | Совпадает с любым непробельным символом. Эквивалентно [^ \f\n\r\t\v]. |
| \w | Совпадает с любым словесным символом, включая подчеркивание. Эквивалентно '[A-Za-z0-9_]'. |
| \W | Совпадает с любым несловесным символом. Эквивалентно '[^A-Za-z0-9_]'. |