English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной курс Python

Управление потоком в Python

Функции в Python

Типы данных Python

Файловые операции в Python

Объекты и классы в Python

Даты и время в Python

Продвинутые знания Python

Руководство Python

Регулярные выражения (RegEx) в Python

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

Регулярное выражение (RegEx) это последовательность символов, определяющих шаблон поиска. Например, }}

^a...s$

Верхний код определяет шаблон RegEx. Шаблон:aначинающаяся сsзаканчивающаясяЛюбая строка из пяти символов.

Шаблоны, определенные RegEx, могут использоваться для соответствия строкам.

ВыражениеСтрокаСовпадает?
^a...s$absНет совпадений
aliasСовпадает
abyssСовпадает
AliasНет совпадений
An abacusНет совпадений

Python имеет модуль под названием reRegEx. Вот пример:

import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
  print("Поиск успешен.")
else:
  print("Поиск не успешен.")

Здесь мы используем функцию re.match() для поиска шаблона в тестовой строке. Если поиск успешен,该方法 возвращает объект соответствия. Если нет,则在озвращает None.

reмодулям, которые определены для использования с RegEx. Перед этим давайте изучим саму регулярное выражение.

Если вы уже знаете основы RegEx, перейдите кPython RegEx.

Использование регулярного выражения для указания шаблона

Для указания регулярного выражения используются символы метки. В приведенных выше примерах ^ и $ являются символами метки.

Символы метки

Символы метки это символы, которые RegEx движок интерпретирует особым образом. Вот список символов метки:

[] . ^ $ * + ? {} () \ |

[] - квадратные скобки

Квадратные скобки определяют группу символов, которые вы хотите соответствовать.

ВыражениеСтрокаСовпадает?
[abc]a1 совпадение
ac2 соответствия
Hey JudeНет совпадений
abc de ca5 соответствий

Здесь, [abc] будет соответствовать, если вы хотите соответствовать строке, содержащей а, b или c.

Вы также можете использовать диапазон символов в квадратных скобках.

  • [a-e] эквивалентно [abcde].

  • [1-4] эквивалентно [1234].

  • [0-39] эквивалентно [01239].

Вы можете использовать символ вставки ^ в начале квадратных скобок для дополнения (инверсии) набора символов.

  • [^abc] означает все, кромеaилиbилиcза пределамиofЛюбой символ.

  • [^0-9] означает любые символы, не являющиеся цифрами.

.- Точка

Точка соответствует любому одному символу (за исключением символы нового строки '\n').

ВыражениеСтрокаСовпадает?
..aНет совпадений
ac1 совпадение
acd1 совпадение
acde2 соответствия (включая 4 символа)

^- Символ вставки

Символ вставки ^ используется для проверки, начинается ли строка с определенного символа.

ВыражениеСтрокаСовпадает?
^aa1 совпадение
abc1 совпадение
bacНет совпадений
^ababc1 совпадение
acbНет соответствия (начинается с a, но после него нет b)

$- 美元

美元符号$用于检查字符串是否某个特定字符结尾.

ВыражениеСтрокаСовпадает?
a$a1 совпадение
formula1 совпадение
cabНет совпадений

*- 星号

星号符号*匹配零个或多个剩余的模式。

ВыражениеСтрокаСовпадает?
ma*nmn1 совпадение
man1 совпадение
maaan1 совпадение
main没有匹配项(a后面没有n)
woman1 совпадение

+- 加号

加号会+匹配一个或多个剩余的模式。

ВыражениеСтрокаСовпадает?
ma+nmn没有匹配项(没有a字符)
man1 совпадение
maaan1 совпадение
main没有匹配项(a后跟n)
woman1 совпадение

?- 问号

问号符号会?匹配零或一出现的剩余模式。

ВыражениеСтрокаСовпадает?
ma?nmn1 совпадение
man1 совпадение
maaan没有匹配项(超过一个a字符)
main没有匹配项(a后跟n)
woman1 совпадение

{}- 大括号

考虑以下代码:{n,m}。这意味着至少要保留n个样式,并且最多重复m个样式。

ВыражениеСтрокаСовпадает?
a{2,3}abc datНет совпадений
abc daat1个匹配(在)daat
aabc daaat2个匹配项(位于aabc和)daaat
aabc daaaat2个匹配项(位于aabc和)daaaat

让我们再尝试一个示例。RegEx [0-9]{2, 4}匹配至少2位但不超过4位

ВыражениеСтрокаСовпадает?
[0-9]{2,4}ab123csde1个匹配(在处匹配)ab123csde
12 and 3456732 совпадения (находятся)12 and 345673
1 and 2Нет совпадений

|- 竖线

竖线|用于交替显示(or运算符)。

ВыражениеСтрокаСовпадает?
a|bcdeНет совпадений
ade1个匹配(在处匹配ade)
acdbea3 совпадения (находятся)acdbea

在这里,a|b匹配任何包含aилиb的Строка

()- 括号

括号()用于对子模式进行分组。例如,(a|b|c)xz匹配任何与aилиbилиc匹配且后跟xz的Строка

ВыражениеСтрокаСовпадает?
(a|b|c)xzab xzНет совпадений
abxz1个匹配(在处匹配)abxz
axz cabxz2 совпадения (находятся)axzbc cabxz

\- 反斜杠

反斜杠\用于转义包括所有元字符在内的各种字符。例如,

\$aЕсли字符串包含$后跟则匹配a。在此,$RegEx引擎不会以特殊方式对其进行解释。

如果不确定某个字符是否具有特殊含义,可以将其\放在前面。这样可以确保不对字符进行特殊处理。

特殊序列

特殊序列使常用模式更易于编写。以下是特殊序列的列表:

\A -Если指定字符在字符串的开头,则匹配。

ВыражениеСтрокаСовпадает?
\Athethe sunСовпадает
In the sunНет совпадений

\b -Если指定的字符在单词的开头或结尾,则匹配。

ВыражениеСтрокаСовпадает?
\bfoofootballСовпадает
a footballСовпадает
afootballНет совпадений
foo\bthe fooСовпадает
the afoo testСовпадает
the afootestНет совпадений

\B - Сравнивается с \b. Если指定的 символНе вСовпадает в начале или конце слова.

ВыражениеСтрокаСовпадает?
\BfoofootballНет совпадений
a footballНет совпадений
afootballСовпадает
foo\Bthe fooНет совпадений
the afoo testНет совпадений
the afootestСовпадает

\d - Совпадает с любыми десятичными цифрами. Эквивалентно [0-9].

ВыражениеСтрокаСовпадает?
\d12abc33 совпадения (находятся)12abc3
PythonНет совпадений

\D - Совпадает с любыми символами, не являющимися десятичными цифрами. Эквивалентно [^0-9].

ВыражениеСтрокаСовпадает?
\D1ab34"503 совпадения (находятся) 1ab34"50
1345Нет совпадений

\s - Совпадает с любыми местами в строке, содержащими пробельные символы. Эквивалентно [ \t\n\r\f\v].

ВыражениеСтрокаСовпадает?
\sPython RegEx1 совпадение
PythonRegExНет совпадений

\S - Совпадает с любыми местами в строке, содержащими не пробельные символы. Эквивалентно [^ \t\n\r\f\v].

ВыражениеСтрокаСовпадает?
\Sa b2 совпадения (находятся) a b
   Нет совпадений

\w - Совпадает с любыми буквенно-цифровыми символами (цифрами и буквами). Эквивалентно [a-zA-Z0-9_]. Кстати, символ подчеркивания _ также считается символом буквенно-цифровым.

ВыражениеСтрокаСовпадает?
\w12&": ;c3 совпадения (находятся)12&": ;c
%"> !Нет совпадений

\W - Совпадает с любыми символами, не являющимися буквенно-цифровыми. Эквивалентно [^a-zA-Z0-9_].

ВыражениеСтрокаСовпадает?
\W1a2%c1 совпадение (в 1)a>>> match.start()%c
PythonНет совпадений

\Z - Совпадает, если指定的 символ в конце строки.

ВыражениеСтрокаСовпадает?
\ZPythonI like Python1 совпадение
I like PythonНет совпадений
Python is fun.Нет совпадений

Совет:Чтобы создавать и тестировать регулярные выражения, можно использовать инструмент тестирования RegEx, напримерregex. Этот инструмент не только поможет вам создавать регулярные выражения, но и поможет вам изучить их.

Теперь, когда вы знаете основы RegEx, давайте обсудим, как использовать RegEx в коде Python.

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

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

import re

Этот модуль определяет некоторые функции и константы, которые можно использовать с RegEx.

re.findall()

Метод re.findall() возвращает список строк, содержащих все совпадения.

Пример 1: re.findall()

# Извлечение чисел из строки
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string) 
print(result)
# 输出: ['12', '89', '34']

如果找不到该模式,则re.findall()返回一个空列表。

re.split()

split方法对匹配的字符串进行拆分,并返回发生拆分的字符串列表。

示例2:re.split()

import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string) 
print(result)
# 输出: ['Twelve:', ' Eighty nine:', '.']

如果找不到该模式,则re.split()返回一个包含空字符串的列表。

您可以将maxsplit参数传递给re.split()方法。这是将要发生的最大拆分次数。

import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# maxsplit = 1
# split only at the first occurrence
result = re.split(pattern, string, 1) 
print(result)
# 输出: ['Twelve:', ' Eighty nine:89 Nine:9.']

顺便说一下,maxsplit默认值为0;默认值为0。这意味着拆分所有匹配的结果。

re.sub()

re.sub()的语法:

re.sub(pattern, replace, string)

该方法返回一个字符串,其中匹配的匹配项被替换为replace变量的内容。

示例3:re.sub()

# Программа для удаления всех пробелов
import re
# Многострочная строка
string = 'abc 12\
de 23 \n f45 6'
# Соответствие всем пробельным символам
pattern = '\s+'
# Пробел
replace = ''
new_string = re.sub(pattern, replace, string) 
print(new_string)
# 输出: abc12de23f456

如果找不到该模式,则re.sub()返回原始字符串。

您可以将count作为re.sub()方法的第四个参数传递。如果省略,则结果为0。这将替换所有出现的匹配项。

import re
# Многострочная строка
string = 'abc 12\
de 23 \n f45 6'
# Соответствие всем пробельным символам
pattern = '\s+'
replace = ''
new_string = re.sub(r'\s+', replace, string, 1) 
print(new_string)
# 输出:
# abc12de 23
# f45 6

re.subn()

re.subn()类似re.sub(),期望它返回一个包含2个元素的元组,其中包含新字符串和替换次数。

Пример 4: re.subn()

# Программа для удаления всех пробелов
import re
# Многострочная строка
string = 'abc 12\
de 23 \n f45 6'
# Соответствие всем пробельным символам
pattern = '\s+'
# Пробел
replace = ''
new_string = re.subn(pattern, replace, string) 
print(new_string)
# Вывод: ('abc12de23f456', 4)

re.search()

Метод re.search() принимает два параметра: шаблон и строка. Этот метод ищет первую позицию в строке, соответствующую шаблону RegEx.

Если поиск успешен, то re.search() возвращает объект соответствия. Если нет, то возвращает None.

match = re.search(pattern, str)

Пример 5: re.search()

import re
string = "Python is fun"
# Проверка, находится ли "Python" в начале
match = re.search('\APython', string)
if match:
  print("pattern found inside the string")
else:
  print("pattern not found")  
# Вывод: pattern found inside the string

Здесь,matchсодержит объект match.

объект соответствия

Вы можете использоватьdir()Функция получает методы и свойства объекта соответствия.

Некоторые из常用的 методов и свойств объекта соответствия:

match.group()

Метод group() возвращает часть строки, соответствующую шаблону.

Пример 6: Объект соответствия

import re
string = '39801 356, 2102 1111'
# Три цифры, затем пробел, две цифры
pattern = '(\d{3}) (\d{2})'
# Переменная match содержит объект Match.
match = re.search(pattern, string) 
if match:
  print(match.group())
else:
  print("pattern not found")
# Вывод: 801 35

Здесь,matchПеременная содержит объект match.

Наша модель (\d{3}) (\d{2}) имеет две подгруппы (\d{3}) и (\d{2}). Вы можете получить часть строки одной из этих заключенных в скобки подгрупп. Вот так:

>>> match.group(1)
>>> match.group(1)
'801'
>>> match.group(2)
'35'
>>> match.groups()
>>> match.group(1, 2)
>>> match.groups()

('801', '35')

match.start(), match.end() и match.span()

Функция start() возвращает индекс начала соответствующего подстроки. Так же, end() возвращает индекс конца соответствующей подстроки.
>>> match.start()
2
>>> match.end()

8

Функция span() возвращает кортеж, содержащий начальный и конечный индексы соответствия.
>>> match.span()

(2, 8)

match.re и match.string

Атрибут re объекта соответствия возвращает объект регулярного выражения. Так же, атрибут string возвращает переданную строку.
>>> match.re
>>> match.string
'39801 356, 2102 1111'

Мы рассмотрели все常用 методы, определённые в модуле re. Если вы хотите узнать больше информации, пожалуйста, посетитеМодуль re Python 3.

Использование префикса r перед RegEx

Если использовать префикс r перед регулярным выражениемrилиRпрефикса означает исходную строку. Например, '\n' — это новая строка, а r'\n' означает два символа: backslash \ и n.

反斜杠 \ используется для escaping различных символов, включая все метасимволы. Однако, использованиеrПрефикс \ рассматривается как обычный символ.

Пример 7: Использование исходных строк с префиксом r

import re
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string) 
print(result)
# Вывод: ['\n', '\r']