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 до количества содержащихся подгрупп. |
Пример
Вывод приведенного выше примера:
(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 --> matchObj.group() : dogs
Поиск и замена
Модуль re в Python предоставляет re.sub для замены совпадений в строке.
Синтаксис:
re.sub(pattern, repl, string, count=0, flags=0)
Параметры:
- pattern: строка шаблона в регулярном выражении.
- repl: Строка замены, которая также может быть функцией.
- string: исходная строка для поиска и замены.
- count: Максимальное количество замен после сопоставления с шаблоном. Значение по умолчанию 0 означает заменить все совпадения.
- flags: Режим сопоставления, используемый во время компиляции, в числовой форме.
Первые три — обязательные параметры, а последние два — необязательные параметры.
Пример
Результат выполнения приведенного выше примера выглядит следующим образом:
电话号码 : 2004-959-559 电话号码 : 2004959559
Параметр repl является функцией
В следующем примере совпавшие в строке числа умножаются на 2:
Пример
Результат выполнения:
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 означает включение как игнорирования регистра, так и многострочного режима.
Пример
Пример
Выше, когда совпадение успешно, возвращается объект Match, где:
group([group1, …])Метод используется для получения одной или нескольких строк, совпавших с группой. Когда нужно получить всю совпавшую подстроку, можно напрямую использоватьgroup()илиgroup(0);start([group])Метод используется для получения начальной позиции подстроки, совпавшей с группой, во всей строке (индекс первого символа подстроки). Значение параметра по умолчанию — 0;end([group])Метод используется для получения конечной позиции подстроки, совпавшей с группой, во всей строке (индекс последнего символа подстроки + 1). Значение параметра по умолчанию — 0;span([group])Метод возвращает(start(group), end(group))。
Давайте рассмотрим другой пример:
Пример
findall
Находит все подстроки, совпавшие с регулярным выражением в строке, и возвращает список. Если есть несколько совпадающих шаблонов, возвращает список кортежей. Если совпадений не найдено, возвращает пустой список.
Примечание:match и search совпадают один раз, findall находит все совпадения.
Синтаксис:
re.findall(pattern, string, flags=0) или pattern.findall(string[, pos[, endpos]])
Параметры:
- patternШаблон для сопоставления.
- stringСтрока для сопоставления.
- posНеобязательный параметр, задаёт начальную позицию в строке, по умолчанию 0.
- endposНеобязательный параметр, задаёт конечную позицию в строке, по умолчанию — длина строки.
Найти все числа в строке:
Пример
Результат вывода:
['123', '456'] ['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) совпадения
Модификаторы регулярных выражений — необязательные флаги
Регулярные выражения могут включать необязательные модификаторы-флаги для управления режимами сопоставления.
Следующие флаги можно использовать отдельно или комбинировать с помощью побитового ИЛИ (|). Например, 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_]'. |