Основы синтаксиса регулярных выражений в Python: создание шаблонов для поиска и обработки строковых данных.

онлайн тренажер по питону
Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Самоучитель Python 3, собранный из материалов данного сайта.Предназначен в основном для тех, кто хочет изучить язык программирования Python с нуля.

Что такое регулярные выражения в Python

Регулярные выражения (Regular Expressions, regex) в Python — это мощный инструмент для работы с текстовыми данными. Они позволяют осуществлять поиск, извлечение, проверку и замену текста на основе заданных шаблонов. Модуль re в Python предоставляет полный набор функций для работы с регулярными выражениями.

Синтаксис регулярных выражений

Специальные символы

Символ Описание
. Любой символ, кроме символа новой строки (\n)
^ Начало строки
$ Конец строки
* Ноль или более повторений предыдущего символа
+ Одно или более повторений предыдущего символа
? Ноль или одно повторение предыдущего символа
{n} Ровно n повторений предыдущего символа
{n,} Не менее n повторений предыдущего символа
{n,m} От n до m повторений предыдущего символа
\ Экранирование специальных символов
[] Набор символов
` `

Специальные последовательности

Последовательность Описание
\d Цифра (0-9)
\D Не цифра
\w Буквенно-цифровой символ (a-z, A-Z, 0-9, _)
\W Не буквенно-цифровой символ
\s Пробельный символ (пробел, табуляция, новая строка)
\S Не пробельный символ
\b Граница слова
\B Не граница слова

Группировка и модификаторы

Элемент Описание
() Группировка символов
\1, \2, ... Обратные ссылки на группы
re.IGNORECASE (или re.I) Игнорировать регистр при сопоставлении
re.MULTILINE (или re.M) Разрешить ^ и $ сопоставлять начало и конец каждой строки
re.DOTALL (или re.S) Символ . соответствует любому символу, включая новую строку
re.VERBOSE (или re.X) Позволяет использовать пробелы и комментарии в шаблоне

Основные методы модуля re

1. re.compile(pattern, flags=0)

Компилирует регулярное выражение в объект Pattern для повторного использования.

import re

# Компилируем регулярное выражение для поиска чисел
pattern = re.compile(r'\d+')
text = 'Цена: 1500 рублей'
result = pattern.search(text)
print(result.group())  # Вывод: 1500

2. re.search(pattern, string, flags=0)

Ищет первое сопоставление регулярного выражения в строке.

import re

text = 'Телефон: +7 (123) 456-78-90'
match = re.search(r'\+\d{1,3}', text)
if match:
    print(match.group())  # Вывод: +7

3. re.match(pattern, string, flags=0)

Ищет сопоставление регулярного выражения только в начале строки.

import re

text = '2023-12-25 - дата события'
match = re.match(r'\d{4}-\d{2}-\d{2}', text)
if match:
    print(match.group())  # Вывод: 2023-12-25

4. re.findall(pattern, string, flags=0)

Находит все сопоставления и возвращает их в виде списка.

import re

text = 'Email: user@example.com, admin@site.ru'
emails = re.findall(r'\w+@\w+\.\w+', text)
print(emails)  # Вывод: ['user@example.com', 'admin@site.ru']

5. re.finditer(pattern, string, flags=0)

Возвращает итератор объектов Match для всех сопоставлений.

import re

text = 'Цены: 100р, 250р, 500р'
matches = re.finditer(r'\d+', text)
for match in matches:
    print(f'Найдено число: {match.group()} на позиции {match.start()}')

6. re.sub(pattern, repl, string, count=0, flags=0)

Заменяет все сопоставления на указанную подстановку.

import re

text = 'Дата: 25.12.2023'
# Заменяем формат даты с точек на дефисы
new_text = re.sub(r'(\d{2})\.(\d{2})\.(\d{4})', r'\3-\2-\1', text)
print(new_text)  # Вывод: Дата: 2023-12-25

7. re.split(pattern, string, maxsplit=0, flags=0)

Разделяет строку по регулярному выражению.

import re

text = 'яблоки,груши;апельсины:мандарины'
fruits = re.split(r'[,;:]', text)
print(fruits)  # Вывод: ['яблоки', 'груши', 'апельсины', 'мандарины']

Практические примеры использования

Валидация email адресов

import re

def validate_email(email):
    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    return re.match(pattern, email) is not None

print(validate_email('user@example.com'))  # True
print(validate_email('invalid-email'))     # False

Извлечение номеров телефонов

import re

text = '''
Контакты:
+7 (123) 456-78-90
8-800-555-35-35
+7 987 654 32 10
'''

phone_pattern = r'\+?[78][-\s]?(?:\(\d{3}\)|\d{3})[-\s]?\d{3}[-\s]?\d{2}[-\s]?\d{2}'
phones = re.findall(phone_pattern, text)
print(phones)

Работа с HTML тегами

import re

html = '<p>Это параграф</p><div>Это div</div>'
# Удаляем все HTML теги
clean_text = re.sub(r'<[^>]+>', '', html)
print(clean_text)  # Вывод: Это параграфЭто div

Поиск слов определенной длины

import re

text = 'Python это мощный язык программирования'
# Найти все слова длиной от 5 до 8 символов
long_words = re.findall(r'\b\w{5,8}\b', text)
print(long_words)  # Вывод: ['Python', 'мощный']

Группы захвата и именованные группы

import re

text = 'Дата рождения: 15.03.1990'
# Использование групп захвата
match = re.search(r'(\d{2})\.(\d{2})\.(\d{4})', text)
if match:
    day, month, year = match.groups()
    print(f'День: {day}, Месяц: {month}, Год: {year}')

# Именованные группы
pattern = r'(?P<day>\d{2})\.(?P<month>\d{2})\.(?P<year>\d{4})'
match = re.search(pattern, text)
if match:
    print(f'Год: {match.group("year")}')

Советы по оптимизации

1. Компилируйте регулярные выражения для повторного использования

import re

# Неэффективно - компилируется каждый раз
for text in texts:
    re.search(r'\d+', text)

# Эффективно - компилируется один раз
pattern = re.compile(r'\d+')
for text in texts:
    pattern.search(text)

2. Используйте raw строки

# Правильно
pattern = r'\d+\.\d+'

# Неправильно - требует двойного экранирования
pattern = '\\d+\\.\\d+'
 

категории

  • Введение в Python
  • Основы программирования на Python
  • Управляющие конструкции
  • Структуры данных
  • Функции и модули
  • Обработка исключений
  • Работа с файлами и потоками
  • файловая система
  • Объектно-ориентированное программирование (ООП)
  • Регулярные выражения
  • Дополнительные темы
  • Общая база питона