Регулярные выражения в Python (модуль re) — практическое руководство
Регулярные выражения в Python (модуль re) — практическое руководство
Узнайте, как использовать силу регулярных выражений в Python с модулем re. Пошаговые примеры иллюстрируют распространённые паттерны, техники сопоставления и продвинутые функции.
Что такое регулярное выражение?
Регулярное выражение (RegEx) — это последовательность символов, определяющая шаблон поиска. Например, паттерн ^a...s$ соответствует любой пятисимвольной строке, начинающейся с a и заканчивающейся s.
^a...s$
Паттерны можно сопоставлять со строками. Таблица ниже демонстрирует поведение паттерна с разными входами:
| Выражение | Строка | Совпало? |
|---|---|---|
^a...s$ | abs | Нет совпадения |
alias | Совпало | |
abyss | Совпало | |
Alias | Нет совпадения | |
An abacus | Нет совпадения |
Модуль re Python предоставляет инструменты для работы с RegEx. Быстрый пример, использующий re.match() для проверки паттерна против строки:
import re
pattern = '^a...s$'
test_string = 'abyss'
result = re.match(pattern, test_string)
if result:
print("Search successful.")
else:
print("Search unsuccessful.")
Когда паттерн найден, re.match() возвращает объект совпадения; иначе — None.
Задание паттернов с метасимволами
Метасимволы — специальные символы, которые движок regex интерпретирует особым образом. Ниже — краткий справочник самых распространённых метасимволов:
[] . ^ $ * + ? {} () \ |
Квадратные скобки: []
Квадратные скобки задают набор символов для сопоставления. Например, [abc] соответствует любому одиночному вхождению a, b или c.
| Выражение | Строка | Совпало? |
|---|---|---|
[abc] | a | 1 совпадение |
ac | 2 совпадения | |
Hey Jude | Нет совпадения | |
abc de ca | 5 совпадений |
Диапазоны выражаются дефисом, например [a-e] равно [abcde]. Для инверсии набора поставьте каретку ^ после открывающей скобки, например [^abc] соответствует любому символу, кроме a, b, c.
Точка: .
Точка соответствует любому одиночному символу, кроме новой строки.
| Выражение | Строка | Совпало? |
|---|---|---|
.. | a | Нет совпадения |
ac | 1 совпадение | |
acd | 1 совпадение | |
acde | 2 совпадения (содержит 4 символа) |
Каретка: ^ и Доллар: $
Каретка утверждает начало строки; доллар — конец. Например, ^a соответствует любой строке, начинающейся с a, а a$ — любой строке, заканчивающейся a.
| Выражение | Строка | Совпало? |
|---|---|---|
^a | a | 1 совпадение |
abc | 1 совпадение | |
bac | Нет совпадения | |
^ab | abc | 1 совпадение |
acb | Нет совпадения (начинается с a, но не следует b) |
| Выражение | Строка | Совпало? |
|---|---|---|
a$ | a | 1 совпадение |
formula | 1 совпадение | |
cab | Нет совпадения |
Квантификаторы: *, +, ?, {n,m}
Эти символы контролируют, сколько раз предшествующий элемент должен появляться.
*— ноль или более раз.+— один или более раз.?— ноль или один раз.{n,m}— как минимум n и максимум m раз.
Примеры:
| Выражение | Строка | Совпало? |
|---|---|---|
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 совпадение |
| Выражение | Строка | Совпало? |
|---|---|---|
a{2,3} | abc dat | Нет совпадения |
abc daat | 1 совпадение (в daat) | |
aabc daaat | 2 совпадения (в aabc и daaat) | |
aabc daaaat | 2 совпадения (в aabc и daaaat) |
Часто используемый паттерн: [0-9]{2,4} соответствует двум до четырёх последовательным цифрам.
| Выражение | Строка | Совпало? |
|---|---|---|
[0-9]{2,4} | ab123csde | 1 совпадение (в ab123csde) |
12 and 345673 | 3 совпадения (12, 3456, 73) | |
1 and 2 | Нет совпадения |
Альтернация: |
Вертикальная черта реализует логическое ИЛИ. Например, a|b соответствует любой строке, содержащей a или b.
| Выражение | Строка | Совпало? |
|---|---|---|
a|b | cde | Нет совпадения |
ade | 1 совпадение (в ade) | |
acdbea | 3 совпадения (в acdbea) |
Группировка: ()
Скобки группируют подпаттерны и захватывают совпавшие подстроки. Пример: (a|b|c)xz соответствует любой строке, содержащей a, b или c, за которыми следует xz.
| Выражение | Строка | Совпало? |
|---|---|---|
(a|b|c)xz | ab xz | Нет совпадения |
abxz | 1 совпадение (в abxz) | |
axz cabxz | 2 совпадения (в axzbc cabxz) |
Экранирование: \
Используйте обратный слэш для обращения с метасимволом как с буквальным. Например, \$a соответствует буквальной последовательности $a, а не интерпретирует $ как якорь конца строки.
Специальные последовательности
Специальные последовательности упрощают распространённые паттерны. Ниже — справочный список с иллюстративными примерами.
Начало строки: \A
| Выражение | Строка | Совпало? |
|---|---|---|
\Athe | the sun | Совпало |
In the sun | Нет совпадения |
Граница слова: \b
| Выражение | Строка | Совпало? |
|---|---|---|
\bfoo | football | Совпало |
a football | Совпало | |
afootball | Нет совпадения | |
foo\b | the foo | Совпало |
the afoo test | Совпало | |
the afootest | Нет совпадения |
Не граница слова: \B
| Выражение | Строка | Совпало? |
|---|---|---|
\Bfoo | football | Нет совпадения |
a football | Нет совпадения | |
afootball | Совпало | |
foo\B | the foo | Нет совпадения |
the afoo test | Нет совпадения | |
the afootest | Совпало |
Цифра: \d / Не цифра: \D
| Выражение | Строка | Совпало? |
|---|---|---|
\d | 12abc3 | 3 совпадения (в 12abc3) |
Python | Нет совпадения | |
\D | 1ab34"50 | 3 совпадения (в 1ab34"50) |
1345 | Нет совпадения |
Пробельный символ: \s / Не пробельный: \S
| Выражение | Строка | Совпало? |
|---|---|---|
\s | Python RegEx | 1 совпадение |
PythonRegEx | Нет совпадения | |
\S | a b | 2 совпадения (в a b) |
| Нет совпадения |
Символ слова: \w / Не слово: \W
| Выражение | Строка | Совпало? |
|---|---|---|
\w | 12&": ;c | 3 совпадения (в 12": ;c) |
"%> ! | Нет совпадения | |
\W | 1a2%c | 1 совпадение (в 1a2%c) |
Python | Нет совпадения |
Конец строки: \Z
| Выражение | Строка | Совпало? |
|---|---|---|
Python\Z | I like Python | 1 совпадение |
I like Python Programming | Нет совпадения | |
Python is fun. | Нет совпадения |
Совет: Используйте онлайн-тестер regex вроде regex101 для быстрого создания и отладки паттернов.
Использование RegEx в Python
Модуль re Python предлагает богатый набор функций и констант для операций с regex. Импортируйте его:
import re
Ниже — самые распространённые утилиты и как их применять.
re.findall()
Возвращает список всех непересекающихся совпадений в строке.
# Извлечение всех чисел из строки
import re
string = 'hello 12 hi 89. Howdy 34'
pattern = '\d+'
result = re.findall(pattern, string)
print(result) # Вывод: ['12', '89', '34']
Когда совпадений нет, возвращается пустой список.
re.split()
Разбивает строку в каждой точке, где паттерн совпадает, возвращая список подстрок.
import re
string = 'Twelve:12 Eighty nine:89.'
pattern = '\d+'
result = re.split(pattern, string)
print(result) # Вывод: ['Twelve:', ' Eighty nine:', '.']
Используйте опциональный аргумент maxsplit для ограничения числа разбиений. Значение 0 (по умолчанию) разбивает при каждом совпадении.
import re
string = 'Twelve:12 Eighty nine:89 Nine:9.'
pattern = '\d+'
# Разбить только при первом вхождении
result = re.split(pattern, string, 1)
print(result) # Вывод: ['Twelve:', ' Eighty nine:89 Nine:9.']
re.sub()
Заменяет все вхождения паттерна на строку замены.
# Удаление всех пробельных символов
import re
string = 'abc 12\nde 23 \n f45 6'
pattern = '\s+'
replace = ''
new_string = re.sub(pattern, replace, string)
print(new_string) # Вывод: abc12de23f456
Для ограничения замен предоставьте аргумент count. Значение 0 заменяет каждое совпадение.
new_string = re.sub(r'\s+', replace, string, 1)
print(new_string) # Вывод:
# abc12de 23
# f45 6
re.subn()
Как re.sub(), но возвращает кортеж, содержащий новую строку и число выполненных замен.
new_string = re.subn(pattern, replace, string)
print(new_string) # Вывод: ('abc12de23f456', 4)
re.search()
Находит первое место, где паттерн совпадает.
string = "Python is fun"
match = re.search('\\APython', string)
if match:
print("pattern found inside the string")
else:
print("pattern not found")
# Вывод: pattern found inside the string
Объект совпадения (Match Object)
При обнаружении совпадения re.search() возвращает объект Match. Распространённые методы и атрибуты:
group()— совпавшая подстрока.start()/end()— индексы совпадения.span()— кортеж (start, end).groups()— все захваченные группы.
string = '39801 356, 2102 1111'
pattern = '(\\d{3}) (\\d{2})'
match = re.search(pattern, string)
if match:
print(match.group())
print(match.group(1))
print(match.group(2))
print(match.groups())
print(match.start(), match.end(), match.span())
else:
print("pattern not found")
# Вывод:
# 801 35
# 801
# 35
# ('801', '35')
# 2 8 (2, 8)
Использование сырых строк (префикс r)
Префиксация строкового литерала r трактует обратные слэши как буквальные символы, предотвращая случайные escape-последовательности. Это особенно полезно в regex-паттернах.
string = '\n and \r are escape sequences.'
result = re.findall(r'[\n\r]', string)
print(result) # Вывод: ['\n', '\r']
Для глубокого изучения модуля re обратитесь к официальной документации Python.
Python
- Ключевые слова и идентификаторы в Python: мастерство зарезервированных слов и соглашений об именовании
- Освоение типов данных в Python: практическое руководство
- Мастерство операторов Python: Полное руководство
- Аргументы функций в Python: позиционные, именованные и параметры по умолчанию
- Словари в Python: создание, манипуляции и продвинутые техники
- Итераторы в Python: как они работают и как создать свои
- Замыкания в Python: как вложенные функции захватывают переменные
- Модуль datetime в Python: практическое руководство по датам, времени и часовым поясам
- Освоение модуля time в Python: функции, структуры и практические примеры
- Освоение Python time.sleep(): лучшие практики, многопоточность и реальные примеры