Как использовать регулярные выражения в Python?

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

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Как использовать регулярные выражения в Python? Полное руководство для начинающих и опытных разработчиков

Работа с текстом — одна из самых востребованных задач в программировании. Будь то парсинг HTML-страниц, проверка формата данных или обработка логов — регулярные выражения становятся незаменимым инструментом.

В Python для работы с регулярными выражениями используется модуль re. В этом руководстве мы подробно разберём, как применять регулярные выражения в Python, рассмотрим популярные методы такие как re.search(), re.sub(), и на реальных примерах покажем их практическое применение.


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

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

📚 Примеры задач, решаемых с помощью RegEx:

  • Валидация email и телефонных номеров.

  • Поиск всех чисел в тексте.

  • Замена нежелательных символов.

  • Извлечение определённых слов или фраз.


Импорт модуля re в Python

Перед началом работы нужно импортировать модуль:

python
import re

Базовые символы и конструкции регулярных выражений

Символ Назначение
. Любой символ, кроме новой строки
\d Любая цифра (0-9)
\D Любой нецифровой символ
\w Буква, цифра или подчёркивание
\W Всё, кроме \w
\s Пробел, табуляция, перенос строки
\S Всё, кроме пробелов
^ Начало строки
$ Конец строки
[] Символ из набора
` `
* 0 или более повторений
+ 1 или более повторений
{n,m} От n до m повторений

Метод re.search() — Что это и как работает?

Метод re.search() ищет первое вхождение шаблона в строке.

python
import re text = "Email: example@mail.com" match = re.search(r'\w+@\w+\.\w+', text) if match: print("Найден email:", match.group())

Результат:

graphql
Найден email: example@mail.com

📌 Объяснение:

  • \w+ — одна или более букв/цифр.

  • @ — символ @.

  • \. — точка (экранируется с помощью \).

  • \w+ — домен верхнего уровня.


Метод re.findall() — Поиск всех совпадений

Если нужно найти все совпадения шаблона, используйте findall().

python
text = "Цены: 100$, 250$, 350$" numbers = re.findall(r'\d+', text) print(numbers) # ['100', '250', '350']

Метод re.sub() — Замена текста по шаблону

Метод re.sub() заменяет все вхождения шаблона на указанный текст.

python
text = "Телефон: 123-456-7890" new_text = re.sub(r'\d', 'X', text) print(new_text)

Результат:

makefile
Телефон: XXX-XXX-XXXX

📌 Практическое применение re.sub():

  • Замена персональных данных.

  • Очистка текста от ненужных символов.

  • Форматирование данных.


Группировка в регулярных выражениях

С помощью скобок можно группировать части шаблонов.

python
text = "Дата: 2024-05-09" match = re.search(r'(\d{4})-(\d{2})-(\d{2})', text) if match: year, month, day = match.groups() print(f"Год: {year}, Месяц: {month}, День: {day}")

Результат:

makefile
Год: 2024, Месяц: 05, День: 09

Флаги в регулярных выражениях

Флаги позволяют модифицировать поведение поиска.

Флаг Назначение
re.IGNORECASE (re.I) Игнорировать регистр
re.MULTILINE (re.M) Многострочный режим
re.DOTALL (re.S) Символ . включает символ новой строки
python
text = "Python is great.\nPYTHON is powerful." matches = re.findall(r'python', text, re.IGNORECASE) print(matches) # ['Python', 'PYTHON']

Как использовать re.compile() для оптимизации?

Если вы часто используете один и тот же шаблон, имеет смысл его скомпилировать:

python
pattern = re.compile(r'\d+') result = pattern.findall("123 456 789") print(result) # ['123', '456', '789']

Это повышает производительность, особенно при больших объёмах данных.


Практические примеры использования регулярных выражений

1. Проверка правильности email:

python
email = "user@example.com" if re.match(r'^\w+@\w+\.\w+$', email): print("Email корректный") else: print("Email некорректный")

2. Замена HTML-тегов:

python
html = "<p>Привет, мир!</p>" clean_text = re.sub(r'<.*?>', '', html) print(clean_text) # Привет, мир!

3. Извлечение телефонных номеров:

python
text = "Контакты: +7-912-345-6789, +7-999-888-7766" phones = re.findall(r'\+7-\d{3}-\d{3}-\d{4}', text) print(phones) # ['+7-912-345-6789', '+7-999-888-7766']

FAQ — Часто задаваемые вопросы

1. Чем re.search() отличается от re.match()?

  • re.match() ищет совпадение только в начале строки.

  • re.search() ищет совпадение в любом месте строки.


2. Что делать, если нужно заменить только первое вхождение?

Используйте параметр count в re.sub():

python
text = "foo bar foo bar" result = re.sub('foo', 'baz', text, count=1) print(result) # baz bar foo bar

3. Как избежать экранирования множества символов?

Используйте сырые строки с префиксом r:

python
pattern = r'\d+'

4. Что такое жадные и нежадные квантификаторы?

  • Жадный (*, +): захватывает как можно больше символов.

  • Нежадный (*?, +?): захватывает как можно меньше.

python
text = "<b>текст</b><b>ещё</b>" print(re.findall(r'<b>.*?</b>', text)) # ['<b>текст</b>', '<b>ещё</b>']

5. Можно ли использовать регулярные выражения для работы с файлами?

Да, например, для фильтрации логов:

python
with open('log.txt') as f: for line in f: if re.search(r'ERROR', line): print(line)

6. Как заменить все пробелы на запятые в строке?

python
text = "apple banana orange" new_text = re.sub(r'\s+', ',', text) print(new_text) # apple,banana,orange

Заключение

Регулярные выражения — мощный инструмент для обработки текстов в Python. Освоив методы re.search(), re.findall(), re.sub() и используя флаги, вы сможете решать даже самые сложные задачи обработки строк.

Практика — ключ к успеху! Пробуйте разные шаблоны, анализируйте результаты и постепенно вы станете мастером регулярных выражений.

Новости