Python3 Регулярные выражения

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

В Python используйтеreмодуль для обработки регулярных выражений.

Модуль re предоставляет набор функций, позволяющих выполнять сопоставление с шаблоном, поиск и замену в строках.

reМодуль предоставляет языку Python полную функциональность регулярных выражений.

В этой главе в основном представлены часто используемые функции обработки регулярных выражений в Python. Если вы не знакомы с регулярными выражениями, можете ознакомиться с нашимУчебником по регулярным выражениям。


Функция re.match

re.match пытается сопоставить шаблон с начальной позиции строки. Если сопоставление не удалось в начальной позиции, match() возвращает None.

Синтаксис функции:

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

Описание параметров функции:

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

При успешном совпаденииre.matchметод возвращает объект match, в противном случае он возвращаетNone。

Мы можем использоватьgroup(num)илиgroups()функции объекта match для получения совпавшего выражения.

Методы объекта соответствияОписание
group(num=0)Строка всего совпавшего выражения. group() может принимать несколько номеров групп сразу, и в этом случае возвращает кортеж, содержащий значения, соответствующие этим группам.
groups()Возвращает кортеж, содержащий все строки подгрупп, от 1 до количества содержащихся подгрупп.

Пример

#!/usr/bin/python import re print(re.match('www', 'www.example.com').span()) # Совпадение в начальной позиции print(re.match('com', 'www.example.com')) # Не совпадает в начальной позиции

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

(0, 3)
None

Пример

#!/usr/bin/python3 import re line = "Кошки умнее собак" # .* означает сопоставление любого одного или нескольких символов, кроме символов новой строки (\n, \r) # (.*?) обозначает «нежадный» режим, который сохраняет только первую совпавшую подстроку 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/python3 import re print(re.search('www', 'www.example.com').span()) # Совпадение в начальной позиции print(re.search('com', 'www.example.com').span()) # Не совпадает в начальной позиции

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

(0, 3)
(11, 14)

Пример

#!/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 ("Ничего не найдено!!")
Результат выполнения приведенного выше примера выглядит следующим образом:
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/python3 import re line = "Кошки умнее собак" matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj: print ("совпадение --> matchObj.group() : ", matchObj.group()) else: print ("No match!!") matchObj = re.search( r'dogs', line, re.M|re.I) if matchObj: print ("search --> matchObj.group() : ", matchObj.group()) else: print ("Нет совпадений!!")
Вывод приведенного выше примера:
No match!!
search --> matchObj.group() :  dogs

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

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

Синтаксис:

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

Параметры:

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

Первые три — обязательные параметры, а последние два — необязательные параметры.

Пример

#!/usr/bin/python3 import re phone = "2004-959-559 # Это номер телефона" # Удалить комментарии num = re.sub(r'#.*$', "", phone) print ("Номер телефона:", num) # Удалить нецифровые символы num = re.sub(r'\D', "", phone) print ("Номер телефона:", num)

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

电话号码 :  2004-959-559 
电话号码 :  2004959559

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

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

Пример

#!/usr/bin/python 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

Функция compile

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

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

re.compile(pattern[, flags])

Параметры:

  • pattern: регулярное выражение в виде строки
  • flags необязателен и указывает режим сопоставления, например игнорирование регистра, многострочный режим и т. д. Конкретные параметры:
    • re.IGNORECASE или re.I- делает сопоставление нечувствительным к регистру
  • re.L указывает, что специальные наборы символов \w, \W, \b, \B, \s, \S зависят от текущего окружения
  • re.MULTILINE или re.M - Многострочный режим, изменяет поведение ^ и $, чтобы они соответствовали началу и концу каждой строки в строке.
  • re.DOTALL или re.S — заставляет.совпадать с любым символом, включая перевод строки.
  • re.ASCII — заставляет \w, \W, \b, \B, \d, \D, \s, \S совпадать только с ASCII-символами.
  • re.VERBOSE или re.X — игнорирует пробелы и комментарии, позволяя организовать сложные регулярные выражения более наглядно.

Эти флаги можно использовать по отдельности или комбинировать с помощью побитового OR (|). Например, re.IGNORECASE | re.MULTILINE означает включение как игнорирования регистра, так и многострочного режима.

Пример

Пример

>>>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 объект по адресу 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) # Третья группа не существует Traceback (самый недавний вызов последний): Файл "<stdin>", строка 1, в <модуль> IndexError: нет такой группы

findall

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

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

Синтаксис:

re.findall(pattern, string, flags=0)
или 
pattern.findall(string[, pos[, endpos]])

Параметры:

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

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

Пример

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

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

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

Пример

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) совпадения

Модификаторы регулярных выражений — необязательные флаги

Регулярные выражения могут включать необязательные модификаторы-флаги для управления режимами сопоставления.

Следующие флаги можно использовать отдельно или комбинировать с помощью побитового ИЛИ (|). Например, re.IGNORECASE | re.MULTILINE означает включение обоих режимов: без учёта регистра и многострочного.

МодификаторОписаниеПример
re.IGNORECASE или re.IДелает сопоставление нечувствительным к регистру
import re
pattern = re.compile(r'apple', flags=re.IGNORECASE)
result = pattern.match('Apple')
print(result.group())  # 输出: 'Apple'
re.MULTILINE или re.MМногострочное сопоставление, влияет на^и$, заставляя их сопоставляться с началом и концом каждой строки в исходной строке.
import re
pattern = re.compile(r'^\d+', flags=re.MULTILINE)
text = '123\n456\n789'
result = pattern.findall(text)
print(result)  # 输出: ['123', '456', '789']
re.DOTALL или re.S:заставляет.соответствовать любому символу, включая новую строку.
import re
pattern = re.compile(r'a.b', flags=re.DOTALL)
result = pattern.match('a\nb')
print(result.group())  # 输出: 'a\nb'
re.ASCIIЗаставляет \w, \W, \b, \B, \d, \D, \s, \S соответствовать только ASCII-символам.
import re
pattern = re.compile(r'\w+', flags=re.ASCII)
result = pattern.match('Hello123')
print(result.group())  # 输出: 'Hello123'
re.VERBOSE или re.XИгнорирует пробелы и комментарии, позволяя более ясно организовывать сложные регулярные выражения.
import re
pattern = re.compile(r'''
    \d+  # 匹配数字
    [a-z]+  # 匹配小写字母
''', flags=re.VERBOSE)
result = pattern.match('123abc')
print(result.group())  # 输出: '123abc'

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

Строки шаблонов используют специальный синтаксис для представления регулярного выражения.

Буквы и цифры обозначают сами себя. Буквы и цифры в шаблоне регулярного выражения соответствуют тем же строкам.

Большинство букв и цифр имеют другое значение, если перед ними стоит обратная косая черта.

Знаки пунктуации соответствуют сами себе только при экранировании; в противном случае они имеют специальные значения.

Сам символ обратной косой черты нужно экранировать обратной косой чертой.

Поскольку регулярные выражения часто содержат обратные слеши, лучше всего использовать 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_]'.
Другие расширения