English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В данном руководстве вы узнаете о регулярных выражениях (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] | a | 1 совпадение |
ac | 2 соответствия | |
Hey Jude | Нет совпадений | |
abc de ca | 5 соответствий |
Здесь, [abc] будет соответствовать, если вы хотите соответствовать строке, содержащей а, b или c.
Вы также можете использовать диапазон символов в квадратных скобках.
[a-e] эквивалентно [abcde].
[1-4] эквивалентно [1234].
[0-39] эквивалентно [01239].
Вы можете использовать символ вставки ^ в начале квадратных скобок для дополнения (инверсии) набора символов.
[^abc] означает все, кромеaилиbилиcза пределамиofЛюбой символ.
[^0-9] означает любые символы, не являющиеся цифрами.
.- Точка
Точка соответствует любому одному символу (за исключением символы нового строки '\n').
Выражение | Строка | Совпадает? |
---|---|---|
.. | a | Нет совпадений |
ac | 1 совпадение | |
acd | 1 совпадение | |
acde | 2 соответствия (включая 4 символа) |
^- Символ вставки
Символ вставки ^ используется для проверки, начинается ли строка с определенного символа.
Выражение | Строка | Совпадает? |
---|---|---|
^a | a | 1 совпадение |
abc | 1 совпадение | |
bac | Нет совпадений | |
^ab | abc | 1 совпадение |
acb | Нет соответствия (начинается с a, но после него нет b) |
$- 美元
美元符号$用于检查字符串是否以某个特定字符结尾.
Выражение | Строка | Совпадает? |
---|---|---|
a$ | a | 1 совпадение |
formula | 1 совпадение | |
cab | Нет совпадений |
*- 星号
星号符号*匹配零个或多个剩余的模式。
Выражение | Строка | Совпадает? |
---|---|---|
ma*n | mn | 1 совпадение |
man | 1 совпадение | |
maaan | 1 совпадение | |
main | 没有匹配项(a后面没有n) | |
woman | 1 совпадение |
+- 加号
加号会+匹配一个或多个剩余的模式。
Выражение | Строка | Совпадает? |
---|---|---|
ma+n | mn | 没有匹配项(没有a字符) |
man | 1 совпадение | |
maaan | 1 совпадение | |
main | 没有匹配项(a后跟n) | |
woman | 1 совпадение |
?- 问号
问号符号会?匹配零或一出现的剩余模式。
Выражение | Строка | Совпадает? |
---|---|---|
ma?n | mn | 1 совпадение |
man | 1 совпадение | |
maaan | 没有匹配项(超过一个a字符) | |
main | 没有匹配项(a后跟n) | |
woman | 1 совпадение |
{}- 大括号
考虑以下代码:{n,m}。这意味着至少要保留n个样式,并且最多重复m个样式。
Выражение | Строка | Совпадает? |
---|---|---|
a{2,3} | abc dat | Нет совпадений |
abc daat | 1个匹配(在)daat | |
aabc daaat | 2个匹配项(位于aabc和)daaat | |
aabc daaaat | 2个匹配项(位于aabc和)daaaat |
让我们再尝试一个示例。RegEx [0-9]{2, 4}匹配至少2位但不超过4位
Выражение | Строка | Совпадает? |
---|---|---|
[0-9]{2,4} | ab123csde | 1个匹配(在处匹配)ab123csde |
12 and 345673 | 2 совпадения (находятся)12 and 345673 | |
1 and 2 | Нет совпадений |
|- 竖线
竖线|用于交替显示(or运算符)。
Выражение | Строка | Совпадает? |
---|---|---|
a|b | cde | Нет совпадений |
ade | 1个匹配(在处匹配ade) | |
acdbea | 3 совпадения (находятся)acdbea |
在这里,a|b匹配任何包含aилиb的Строка
()- 括号
括号()用于对子模式进行分组。例如,(a|b|c)xz匹配任何与aилиbилиc匹配且后跟xz的Строка
Выражение | Строка | Совпадает? |
---|---|---|
(a|b|c)xz | ab xz | Нет совпадений |
abxz | 1个匹配(在处匹配)abxz | |
axz cabxz | 2 совпадения (находятся)axzbc cabxz |
\- 反斜杠
反斜杠\用于转义包括所有元字符在内的各种字符。例如,
\$aЕсли字符串包含$后跟则匹配a。在此,$RegEx引擎不会以特殊方式对其进行解释。
如果不确定某个字符是否具有特殊含义,可以将其\放在前面。这样可以确保不对字符进行特殊处理。
特殊序列
特殊序列使常用模式更易于编写。以下是特殊序列的列表:
\A -Если指定字符在字符串的开头,则匹配。
Выражение | Строка | Совпадает? |
---|---|---|
\Athe | the sun | Совпадает |
In the sun | Нет совпадений |
\b -Если指定的字符在单词的开头或结尾,则匹配。
Выражение | Строка | Совпадает? |
---|---|---|
\bfoo | football | Совпадает |
a football | Совпадает | |
afootball | Нет совпадений | |
foo\b | the foo | Совпадает |
the afoo test | Совпадает | |
the afootest | Нет совпадений |
\B - Сравнивается с \b. Если指定的 символНе вСовпадает в начале или конце слова.
Выражение | Строка | Совпадает? |
---|---|---|
\Bfoo | football | Нет совпадений |
a football | Нет совпадений | |
afootball | Совпадает | |
foo\B | the foo | Нет совпадений |
the afoo test | Нет совпадений | |
the afootest | Совпадает |
\d - Совпадает с любыми десятичными цифрами. Эквивалентно [0-9].
Выражение | Строка | Совпадает? |
---|---|---|
\d | 12abc3 | 3 совпадения (находятся)12abc3 |
Python | Нет совпадений |
\D - Совпадает с любыми символами, не являющимися десятичными цифрами. Эквивалентно [^0-9].
Выражение | Строка | Совпадает? |
---|---|---|
\D | 1ab34"50 | 3 совпадения (находятся) 1ab34"50 |
1345 | Нет совпадений |
\s - Совпадает с любыми местами в строке, содержащими пробельные символы. Эквивалентно [ \t\n\r\f\v].
Выражение | Строка | Совпадает? |
---|---|---|
\s | Python RegEx | 1 совпадение |
PythonRegEx | Нет совпадений |
\S - Совпадает с любыми местами в строке, содержащими не пробельные символы. Эквивалентно [^ \t\n\r\f\v].
Выражение | Строка | Совпадает? |
---|---|---|
\S | a b | 2 совпадения (находятся) a b |
Нет совпадений |
\w - Совпадает с любыми буквенно-цифровыми символами (цифрами и буквами). Эквивалентно [a-zA-Z0-9_]. Кстати, символ подчеркивания _ также считается символом буквенно-цифровым.
Выражение | Строка | Совпадает? |
---|---|---|
\w | 12&": ;c | 3 совпадения (находятся)12&": ;c |
%"> ! | Нет совпадений |
\W - Совпадает с любыми символами, не являющимися буквенно-цифровыми. Эквивалентно [^a-zA-Z0-9_].
Выражение | Строка | Совпадает? |
---|---|---|
\W | 1a2%c | 1 совпадение (в 1)a>>> match.start()%c |
Python | Нет совпадений |
\Z - Совпадает, если指定的 символ в конце строки.
Выражение | Строка | Совпадает? |
---|---|---|
\ZPython | I like Python | 1 совпадение |
I like Python | Нет совпадений | |
Python is fun. | Нет совпадений |
Совет:Чтобы создавать и тестировать регулярные выражения, можно использовать инструмент тестирования RegEx, напримерregex. Этот инструмент не только поможет вам создавать регулярные выражения, но и поможет вам изучить их.
Теперь, когда вы знаете основы RegEx, давайте обсудим, как использовать RegEx в коде Python.
Python имеет модуль под названием re, который является модулем регулярных выражений. Чтобы использовать его, нам нужно импортировать модуль.
import re
Этот модуль определяет некоторые функции и константы, которые можно использовать с RegEx.
Метод 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()返回一个空列表。
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(pattern, replace, string)
该方法返回一个字符串,其中匹配的匹配项被替换为replace变量的内容。
# Программа для удаления всех пробелов 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.sub(),期望它返回一个包含2个元素的元组,其中包含新字符串和替换次数。
# Программа для удаления всех пробелов 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() принимает два параметра: шаблон и строка. Этот метод ищет первую позицию в строке, соответствующую шаблону RegEx.
Если поиск успешен, то re.search() возвращает объект соответствия. Если нет, то возвращает None.
match = re.search(pattern, str)
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()Функция получает методы и свойства объекта соответствия.
Некоторые из常用的 методов и свойств объекта соответствия:
Метод group() возвращает часть строки, соответствующую шаблону.
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()
match.start(), match.end() и match.span()
Функция start() возвращает индекс начала соответствующего подстроки. Так же, end() возвращает индекс конца соответствующей подстроки. >>> match.start() 2 >>> match.end()
8
Функция span() возвращает кортеж, содержащий начальный и конечный индексы соответствия. >>> match.span()
match.re и match.string
Атрибут re объекта соответствия возвращает объект регулярного выражения. Так же, атрибут string возвращает переданную строку. >>> match.re >>> match.string '39801 356, 2102 1111'
Мы рассмотрели все常用 методы, определённые в модуле re. Если вы хотите узнать больше информации, пожалуйста, посетитеМодуль re Python 3.
Если использовать префикс r перед регулярным выражениемrилиRпрефикса означает исходную строку. Например, '\n' — это новая строка, а r'\n' означает два символа: backslash \ и n.
反斜杠 \ используется для escaping различных символов, включая все метасимволы. Однако, использованиеrПрефикс \ рассматривается как обычный символ.
import re string = '\n and \r are escape sequences.' result = re.findall(r'[\n\r]', string) print(result) # Вывод: ['\n', '\r']