Регулярные выражения
Модуль re
import re # импорт модуля регулярных выражений
text = "Мой email: user@example.com" # строковое значение
# Поиск первого совпадения
match = re.search(r"\w+@\w+\.\w+", text) # поиск первого совпадения
if match: # условие
print(match.group()) # user@example.com
# Все совпадения
emails = re.findall(r"\w+@\w+\.\w+", text) # все совпадения
# Замена
result = re.sub(r"\d+", "NUMBER", "Цена: 100 рублей") # замена по шаблону
# 'Цена: NUMBER рублей'
Специальные символы
| Символ | Значение |
. | Любой символ, кроме новой строки |
\d | Цифра (0–9) |
\w | Буква, цифра, подчёркивание |
\s | Пробельный символ |
\D | Не цифра |
\W | Не буква/цифра |
\S | Не пробельный |
^ | Начало строки |
$ | Конец строки |
\b | Граница слова |
Квантификаторы
| Символ | Значение |
* | 0 и более |
+ | 1 и более |
? | 0 или 1 |
{3} | Ровно 3 |
{2,5} | От 2 до 5 |
{2,} | 2 и более |
Группы
text = "Иван: 30 лет" # строковое значение
match = re.search(r"(\w+): (\d+)", text) # сопоставление с образцом
if match: # условие
print(match.group(0)) # 'Иван: 30' (всё совпадение)
print(match.group(1)) # 'Иван' (первая группа)
print(match.group(2)) # '30' (вторая группа)
print(match.groups()) # ('Иван', '30')
# Именованные группы
match = re.search(r"(?P\w+): (?P\d+)", text) # сопоставление с образцом
print(match.group("name")) # 'Иван'
Флаги
re.IGNORECASE / re.I — регистронезависимый
re.MULTILINE / re.M — ^ и $ работают по строкам
re.DOTALL / re.S — точка включает \n
re.VERBOSE / re.X — комментарии в паттерне
re.search(r"python", text, re.IGNORECASE) # поиск первого совпадения
# VERBOSE — паттерн с комментариями
pattern = re.compile(r""" # компиляция регулярного выражения
\b
\d{3}
-\d{2}-
\d{2}
\b
""", re.VERBOSE)
Компиляция регулярных выражений
# Без компиляции (каждый раз компилируется заново)
for text in texts: # цикл по элементам
re.search(r"сложный\s+паттерн", text) # поиск первого совпадения
# С компиляцией (быстрее в цикле)
pattern = re.compile(r"сложный\s+паттерн") # компиляция регулярного выражения
for text in texts: # цикл по элементам
pattern.search(text)
Примеры
# Email
r"[\w.+-]+@[\w-]+\.[\w.]+"
# URL
r"https?://[\w./-]+"
# Телефон (Россия)
r"\+7\d{10}|8\d{10}"
# IP-адрес
r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
# Дата ДД.ММ.ГГГГ
r"\d{2}\.\d{2}\.\d{4}"
# HTML-тег
r"<[^>]+>"
# Все цифры в строке
re.findall(r"\d+", text) # все совпадения
# Разделить строку по нескольким разделителям
re.split(r"[,\;\s]+", text) # разделение по шаблону