Регулярные выражения 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 до количества содержащихся подгрупп.

Пример

#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.match('www', 'www.example.com').span()) # Совпадение в начале print(re.match('com', 'www.example.com')) # Не совпадает в начале

Вывод приведенного выше примера:

(0, 3)
None

Пример

#!/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 "Нет совпадений!!"

Результат вышеприведенного примера следующий:

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 до количества содержащихся подгрупп.

Пример

#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.search('www', 'www.example.com').span()) # Совпадение в начале print(re.search('com', 'www.example.com').span()) # Совпадение не в начале

Вывод приведенного выше примера:

(0, 3)
(11, 14)

Пример

#!/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 "Ничего не найдено!!"
Результат вышеприведенного примера следующий:
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

Разница между re.match и re.search

re.match сопоставляет только начало строки. Если начало строки не соответствует регулярному выражению, сопоставление завершается неудачно, и функция возвращает None; в то время как re.search сопоставляет всю строку, пока не будет найдено совпадение.

Пример

#!/usr/bin/python import re line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj: print "совпадение --> matchObj.group() : ", matchObj.group() else: print "Нет совпадений!!" matchObj = re.search( r'dogs', line, re.M|re.I) if matchObj: print "search --> searchObj.group() : ", matchObj.group() else: print "Нет совпадений!!"
Вывод вышеприведённого примера выглядит следующим образом:
No match!!
search --> searchObj.group() :  dogs

Поиск и замена

Модуль re в Python предоставляет re.sub для замены совпадений в строке.

Синтаксис:

re.sub(pattern, repl, string, count=0, flags=0)

Параметры:

  • pattern: строка шаблона в регулярном выражении.
  • repl: строка замены, также может быть функцией.
  • string: исходная строка для поиска и замены.
  • count: максимальное количество замен после сопоставления с шаблоном; по умолчанию 0 означает заменить все совпадения.

Пример

#!/usr/bin/python # -*- coding: UTF-8 -*- 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

Параметр repl является функцией

В следующем примере совпавшие в строке числа умножаются на 2:

Пример

#!/usr/bin/python # -*- coding: UTF-8 -*- import re # Умножить совпавшие числа на 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))

Вывод после выполнения:

A46G8HFD1134

функция re.compile

Функция compile используется для компиляции регулярного выражения и создания объекта регулярного выражения (Pattern), который может использоваться такими функциями, как match(), search() и findall().

Формат синтаксиса:

re.compile(pattern[, flags])

Параметры:

  • pattern: Регулярное выражение в виде строки

  • flags: Необязательный параметр, задаёт режим сопоставления, например игнорирование регистра, многострочный режим и т. д. Конкретные параметры:

    1. re.IИгнорировать регистр
    2. re.LУказывает, что специальные наборы символов \w, \W, \b, \B, \s, \S зависят от текущего окружения
    3. re.MМногострочный режим
    4. re.SТо есть.и любой символ, включая перевод строки (.исключая перевод строки)
    5. re.UУказывает, что специальные наборы символов \w, \W, \b, \B, \d, \D, \s, \S зависят от базы данных свойств символов Unicode
    6. re.XДля повышения читаемости игнорировать пробелы и#комментарии после

Пример

Пример

>>>import re >>> pattern = re.compile(r'\d+') # Используется для сопоставления как минимум одной цифры >>> m = pattern.match('one12twothree34four') # Поиск с начала, нет совпадения >>> print m None >>> m = pattern.match('one12twothree34four', 2, 10) # Начать сопоставление с позиции 'e', нет совпадения >>> print m None >>> m = pattern.match('one12twothree34four', 3, 10) # Начинать сопоставление с позиции '1', совпадает точно >>> print m # Возвращает объект Match <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) # 0 можно опустить '12' >>> m.start(0) # 0 можно опустить 3 >>> m.end(0) # 0 можно опустить 5 >>> m.span(0) # 0 можно опустить (3, 5)

Выше, при успешном сопоставлении, возвращается объект Match, где:

  • group([group1, …])Метод используется для получения строки, сопоставленной одной или несколькими группами. Когда вы хотите получить всю сопоставленную подстроку, можно напрямую использоватьgroup()илиgroup(0);
  • start([group])Метод используется для получения начальной позиции подстроки, сопоставленной группой, во всей строке (индекса первого символа подстроки), со значением параметра по умолчанию 0;
  • end([group])Метод используется для получения конечной позиции подстроки, сопоставленной группой, во всей строке (индекса последнего символа подстроки + 1), со значением параметра по умолчанию 0;
  • span([group])Метод возвращает(start(group), end(group))。

Давайте рассмотрим другой пример:

Пример

>>>import re >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I означает игнорирование регистра >>> m = pattern.match('Hello World Wide Web') >>> print m # Совпадение успешно, возвращает объект Match <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # Возвращает всю совпавшую подстроку 'Hello World' >>> m.span(0) # Возвращает индекс всей совпавшей подстроки (0, 11) >>> m.group(1) # Возвращает подстроку, совпавшую с первой группой 'Hello' >>> m.span(1) # Возвращает индекс подстроки, совпавшей с первой группой (0, 5) >>> m.group(2) # Возвращает подстроку, совпавшую со второй группой 'World' >>> m.span(2) # Возвращает подстроку, совпавшую со второй группой (6, 11) >>> m.groups() # Эквивалентно (m.group(1), m.group(2), ...) ('Hello', 'World') >>> m.group(3) # Третьей группы не существует Трассировка (самый недавний вызов последний): Файл "<stdin>", строка 1, в <модуль> IndexError: нет такой группы

findall

Находит все подстроки, соответствующие регулярному выражению в строке, и возвращает список. Если совпадает несколько шаблонов, возвращает список кортежей. Если совпадений не найдено, возвращает пустой список.

Примечание:match и search выполняют сопоставление один раз, тогда как findall сопоставляет все.

Формат синтаксиса:

findall(string[, pos[, endpos]])

Параметры:

  • string: строка для сопоставления.
  • pos: необязательный параметр, задаёт начальную позицию строки, по умолчанию 0.
  • endpos: необязательный параметр, задаёт конечную позицию строки, по умолчанию равна длине строки.

Найдите все числа в строке:

Пример

# -*- coding:UTF8 -*- import re pattern = re.compile(r'\d+') # Найти числа result1 = pattern.findall('example 123 google 456') result2 = pattern.findall('run88oob123google456', 0, 10) print(result1) print(result2)

Результат вывода:

['123', '456']
['88', '12']

При нескольких совпадающих шаблонах возвращает список кортежей:

Пример

import re

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Строка, которую нужно сопоставить.
флагиФлаги, используемые для управления поведением сопоставления регулярного выражения, например, учет регистра, многострочное сопоставление и т. д. См.:Модификаторы регулярных выражений — необязательные флаги

Пример

# -*- coding: UTF-8 -*- import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group() )

Результат вывода:

12 
32 
43 
3

re.split

Метод split разбивает строку по подстрокам, которые могут быть сопоставлены, и возвращает список. Его использование выглядит следующим образом:

re.split(pattern, string[, maxsplit=0, flags=0])

Параметры:

ПараметрОписание
patternРегулярное выражение для сопоставления.
stringСтрока, которую нужно сопоставить.
maxsplitМаксимальное количество разбиений. maxsplit=1 означает разбить один раз. По умолчанию 0, что означает отсутствие ограничений.
флагиФлаги, используемые для управления поведением сопоставления регулярного выражения, например, учет регистра, многострочное сопоставление и т. д. См.:Модификаторы регулярных выражений — необязательные флаги

Пример

>>>import re >>> re.split('\W+', 'example, example, example.') ['example', 'example', 'example', ''] >>> re.split('(\W+)', ' example, example, example.') ['', ' ', 'example', ', ', 'example', ', ', 'example', '.', ''] >>> re.split('\W+', ' example, example, example.', 1) ['', 'example, example, example.'] >>> re.split('a*', 'hello world') # Для строки, в которой не удаётся найти совпадение, split не будет её разбивать ['hello world']

Объект регулярного выражения

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_]'.
Другие расширения