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

Регулярные выражения (regular expressions, или regex) — это мощный инструмент для работы с текстом, который позволяет искать, сопоставлять и заменять подстроки по определённым шаблонам. В Python для работы с регулярными выражениями используется модуль re.


Основные функции модуля re

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

  2. re.match() — ищет совпадение с шаблоном только в начале строки.

  3. re.findall() — возвращает все совпадения с шаблоном в виде списка.

  4. re.finditer() — возвращает итератор с объектами совпадений.

  5. re.sub() — заменяет все совпадения с шаблоном на указанную строку.

  6. re.split() — разбивает строку по шаблону.


Основные элементы регулярных выражений

  • . — любой символ, кроме новой строки.

  • \d — любая цифра ([0-9]).

  • \D — любой символ, кроме цифры.

  • \w — любая буква, цифра или нижнее подчёркивание ([a-zA-Z0-9_]).

  • \W — любой символ, кроме букв, цифр и нижнего подчёркивания.

  • \s — любой пробельный символ (пробел, табуляция, новая строка).

  • \S — любой символ, кроме пробельных.

  • [] — набор символов. Например, [a-z] — любая строчная буква.

  • ^ — начало строки.

  • $ — конец строки.

  • * — 0 или более повторений.

  • + — 1 или более повторений.

  • ? — 0 или 1 повторение.

  • {n} — ровно n повторений.

  • {n, m} — от n до m повторений.

  • | — логическое "или". Например, a|ba или b.


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

Поиск совпадений с помощью re.search()
import re text = "Мой номер телефона: +7-123-456-78-90" pattern = r"\+\d-\d{3}-\d{3}-\d{2}-\d{2}" # Шаблон для номера телефона match = re.search(pattern, text) if match: print("Найден номер телефона:", match.group()) # Найден номер телефона: +7-123-456-78-90 else: print("Номер не найден.")
Пояснение:
  • re.search() ищет первое совпадение с шаблоном в строке.

  • Шаблон r"\+\d-\d{3}-\d{3}-\d{2}-\d{2}":

    • \+ — символ + (экранирован, так как + имеет специальное значение в regex).

    • \d — любая цифра.

    • - — символ дефиса.

    • \d{3} — ровно 3 цифры.

  • match.group() возвращает найденное совпадение.

  • Если совпадение найдено, выводится номер телефона.

Поиск всех совпадений с помощью re.findall()
import re text = "Цены: $10, $20, $30" pattern = r"\$\d+" # Шаблон для поиска цен prices = re.findall(pattern, text) print("Цены:", prices) # Цены: ['$10', '$20', '$30']
Пояснение:
  • re.findall() возвращает все совпадения с шаблоном в виде списка.

  • Шаблон r"\$\d+":

    • \$ — символ $ (экранирован, так как $ имеет специальное значение в regex).

    • \d+ — одна или более цифр.

  • Результат — список всех цен в тексте.

Замена с помощью re.sub()
import re text = "Сегодня 25.10.2023, а завтра 26.10.2023." pattern = r"\d{2}\.\d{2}\.\d{4}" # Шаблон для даты replacement = "ДД.ММ.ГГГГ" new_text = re.sub(pattern, replacement, text) print(new_text) # Сегодня ДД.ММ.ГГГГ, а завтра ДД.ММ.ГГГГ.
Пояснение:
  • re.sub() заменяет все совпадения с шаблоном на указанную строку.

  • Шаблон r"\d{2}\.\d{2}\.\d{4}":

    • \d{2} — ровно 2 цифры (день или месяц).

    • \. — символ точки (экранирован, так как . имеет специальное значение в regex).

    • \d{4} — ровно 4 цифры (год).

  • Все даты в тексте заменяются на ДД.ММ.ГГГГ.

Разделение строки с помощью re.split()
import re text = "Слова,разделенные;разными:символами" pattern = r"[ ,;:]" # Шаблон для разделения words = re.split(pattern, text) print("Слова:", words) # Слова: ['Слова', 'разделенные', 'разными', 'символами']
  • re.split() разбивает строку по шаблону.

  • Шаблон r"[ ,;:]":

    • [ ,;:] — любой из символов: пробел, запятая, точка с запятой или двоеточие.

  • Результат — список слов, разделённых указанными символами.

Использование групп ()
import re text = "Имя: Alice, Возраст: 25" pattern = r"Имя: (\w+), Возраст: (\d+)" # Группы для имени и возраста match = re.search(pattern, text) if match: print("Имя:", match.group(1)) # Имя: Alice print("Возраст:", match.group(2)) # Возраст: 25
  • Группы () позволяют извлекать части совпадений.

  • Шаблон r"Имя: (\w+), Возраст: (\d+)":

    • (\w+) — группа для имени (одна или более букв/цифр).

    • (\d+) — группа для возраста (одна или более цифр).

  • match.group(1) возвращает первую группу (имя), match.group(2) — вторую (возраст).

Использование re.match()
import re text = "Python is awesome!" pattern = r"Python" match = re.match(pattern, text) if match: print("Найдено совпадение в начале строки:", match.group()) else: print("Совпадение не найдено.")
  • re.match() ищет совпадение только в начале строки.

  • Шаблон r"Python":

    • Ищет слово "Python" в начале строки.

  • Если совпадение найдено, выводится результат.

Использование re.finditer()
import re text = "Цены: $10, $20, $30" pattern = r"\$\d+" for match in re.finditer(pattern, text): # Найдена цена: $10, Найдена цена: $20, Найдена цена: $30 print("Найдена цена:", match.group())
  • re.finditer() возвращает итератор с объектами совпадений.

  • Шаблон r"\$\d+":

    • Ищет цены в формате $ + цифры.

  • Каждое совпадение обрабатывается в цикле.

Валидация email с помощью регулярных выражений
import re def validate_email(email): pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$" if re.match(pattern, email): return True return False email = "example@domain.com" if validate_email(email): print("Email валиден.") else: print("Email невалиден.")
  • Шаблон r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$":

    • ^ — начало строки.

    • [a-zA-Z0-9_.+-]+ — имя email (буквы, цифры, символы _, ., +, -).

    • @ — символ "@".

    • [a-zA-Z0-9-]+ — домен (буквы, цифры, дефисы).

    • \. — точка перед доменной зоной.

    • [a-zA-Z0-9-.]+$ — доменная зона (буквы, цифры, точки, дефисы).

  • re.match() проверяет, соответствует ли строка шаблону.

Извлечение всех хэштегов из текста
import re text = "Это #пример текста с #хэштегами и #Python!" pattern = r"#\w+" hashtags = re.findall(pattern, text) print("Хэштеги:", hashtags) # Хэштеги: ['#пример', '#хэштегами', '#Python']
  • Шаблон r"#\w+":

    • # — символ хэштега.

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

  • re.findall() извлекает все хэштеги из текста.

Замена всех чисел в тексте
import re text = "У меня 3 яблока и 5 апельсинов." pattern = r"\d+" new_text = re.sub(pattern, "N", text) print(new_text) # У меня N яблока и N апельсинов.
  • Шаблон r"\d+":

    • \d+ — одна или более цифр.

  • re.sub() заменяет все числа на N.


Регулярные выражения, непростая и очень интересная тема.
В этой лекции каждый пример демонстрирует возможности регулярных выражений для решения конкретных задач: поиск, замена, извлечение данных, валидация.
Регулярные выражения — это мощный инструмент, который требует практики для эффективного использования.


Комментарии

Добавить комментарий

Чтобы оставить комменатрий необходимо Авторизоваться