Найти в Дзене

Регулярные выражения в Python: Теория с примерами

Регулярные выражения (regular expressions, regex, regexp) – это мощный инструмент для поиска и манипулирования текстом. Они представляют собой последовательность символов, описывающую шаблон для поиска в строке. Python предоставляет встроенную поддержку регулярных выражений через модуль re. Основные понятия: 1. Шаблон (pattern): Строка, содержащая регулярное выражение. Шаблон описывает то, что нужно искать в тексте. 2. Строка (string): Текст, в котором происходит поиск. 3. Модуль re: Модуль Python, предоставляющий функции для работы с регулярными выражениями. Основные функции модуля re: · re.search(pattern, string): Ищет первое соответствие шаблону в строке. Возвращает объект Match при успехе и None при неудаче. · re.match(pattern, string): Ищет соответствие шаблону в начале строки. Возвращает объект Match при успехе и None при неудаче. · re.findall(pattern, string): Находит все неперекрывающиеся соответствия шаблону в строке. Возвращает список строк. · re.finditer(pattern, string): На

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

Основные понятия:

1. Шаблон (pattern): Строка, содержащая регулярное выражение. Шаблон описывает то, что нужно искать в тексте.

2. Строка (string): Текст, в котором происходит поиск.

3. Модуль re: Модуль Python, предоставляющий функции для работы с регулярными выражениями.

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

· re.search(pattern, string): Ищет первое соответствие шаблону в строке. Возвращает объект Match при успехе и None при неудаче.

· re.match(pattern, string): Ищет соответствие шаблону в начале строки. Возвращает объект Match при успехе и None при неудаче.

· re.findall(pattern, string): Находит все неперекрывающиеся соответствия шаблону в строке. Возвращает список строк.

· re.finditer(pattern, string): Находит все неперекрывающиеся соответствия шаблону в строке. Возвращает итератор объектов Match.

· re.sub(pattern, repl, string): Заменяет все соответствия шаблону в строке на строку repl. Возвращает измененную строку.

· re.split(pattern, string): Разделяет строку на список подстрок, используя шаблон в качестве разделителя. Возвращает список строк.

· re.compile(pattern): Компилирует шаблон в объект регулярного выражения. Это может быть полезно, если шаблон используется многократно, так как компиляция шаблона выполняется только один раз.

Специальные символы (метасимволы):

· . (точка): Соответствует любому одиночному символу, кроме новой строки.

· ^ (карет): Соответствует началу строки.

· $ (доллар): Соответствует концу строки.

· * (звездочка): Соответствует нулю или более повторениям предыдущего символа или группы.

· + (плюс): Соответствует одному или более повторениям предыдущего символа или группы.

· ? (вопросительный знак): Соответствует нулю или одному повторению предыдущего символа или группы.

· {m,n}: Соответствует от m до n повторениям предыдущего символа или группы.

· [] (квадратные скобки): Определяют набор символов. Например, [abc] соответствует любому из символов a, b или c.

· [^...] (отрицание в квадратных скобках): Соответствует любому символу, не входящему в набор. Например, [^abc] соответствует любому символу, кроме a, b и c.

· \ (обратный слеш): Экранирует специальные символы или обозначает специальные последовательности.

· | (вертикальная черта): Означает “или”. Например, a|b соответствует a или b.

· () (круглые скобки): Группируют символы и позволяют захватывать совпадения.

Специальные последовательности (escape sequences):

  • \d: Соответствует любой десятичной цифре (эквивалентно [0-9]).
  • \D: Соответствует любому символу, не являющемуся десятичной цифрой (эквивалентно [^0-9]).
  • \s: Соответствует любому пробельному символу (пробел, табуляция, перенос строки и т.д.).
  • \S: Соответствует любому символу, не являющемуся пробельным.
  • \w: Соответствует любому буквенно-цифровому символу и символу подчеркивания (эквивалентно [a-zA-Z0-9_]).
  • \W: Соответствует любому символу, не являющемуся буквенно-цифровым или символом подчеркивания (эквивалентно [^a-zA-Z0-9_]).
  • \b: Соответствует границе слова (позиции между словом и не-словом).

Флаги (flags):

Флаги используются для изменения поведения регулярных выражений. Они передаются в функции re как аргумент flags.

  • re.IGNORECASE или re.I: Игнорирует регистр.
  • re.MULTILINE или re.M: Позволяет символам ^ и $ соответствовать началу и концу каждой строки в многострочной строке.
  • re.DOTALL или re.S: Позволяет символу . соответствовать также символу новой строки.
  • re.VERBOSE или re.X: Позволяет включать в шаблон комментарии и пробелы для улучшения читаемости.

Примеры:

Python

import re

# 1. Поиск конкретной строки:

text = "The quick brown fox jumps over the lazy dog"
pattern = "fox"
result = re.search(pattern, text)
if result:
print("Найдено:", result.group()) # Вывод: Найдено: fox

# 2. Поиск цифр:

text = "My phone number is 123-456-7890"
pattern = r"\d+" # r"" - сырая строка, чтобы избежать экранирования слешей
result = re.findall(pattern, text)
print("Найденные цифры:", result) # Вывод: Найденные цифры: ['123', '456', '7890']

# 3. Поиск email-адресов:

text = "Contact us at info@example.com or support@domain.net"
pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
result = re.findall(pattern, text)
print("Найденные email-адреса:", result) # Вывод: Найденные email-адреса: ['info@example.com', 'support@domain.net']

# 4. Замена текста:

text = "Replace all spaces with underscores"
pattern = r"\s"
replacement = "_"
result = re.sub(pattern, replacement, text)
print("Замененный текст:", result) # Вывод: Замененный текст: Replace_all_spaces_with_underscores

# 5. Разделение строки:

text = "apple,banana,orange,grape"
pattern = r","
result = re.split(pattern, text)
print("Разделенный список:", result) # Вывод: Разделенный список: ['apple', 'banana', 'orange', 'grape']

# 6. Игнорирование регистра:

text = "Hello World"
pattern = "hello"
result = re.search(pattern, text, re.IGNORECASE) # или re.I
if result:
print("Найдено (игнорируя регистр):", result.group()) # Вывод: Найдено (игнорируя регистр): Hello

# 7. Использование групп и Match object:

text = "My birthday is 1990-01-01"
pattern = r"(\d{4})-(\d{2})-(\d{2})" # Группировка года, месяца и дня
result = re.search(pattern, text)
if result:
print("Полная дата:", result.group(0)) # Вывод: Полная дата: 1990-01-01
print("Год:", result.group(1)) # Вывод: Год: 1990
print("Месяц:", result.group(2)) # Вывод: Месяц: 01
print("День:", result.group(3)) # Вывод: День: 01

# 8. Compile pattern

pattern = re.compile(r"\d+")
text = "123 abc 456 def 789"
result = pattern.findall(text)
print(result) # Вывод: ['123', '456', '789']

Рекомендации:

  • Используйте “сырые” строки (raw strings) для шаблонов, чтобы избежать необходимости экранирования обратных слешей. r"pattern"
  • Тестируйте ваши регулярные выражения на небольших примерах, чтобы убедиться, что они работают правильно. Существуют онлайн-инструменты для тестирования регулярных выражений.
  • Будьте осторожны с “жадными” квантификаторами (*, +), они могут захватывать больше текста, чем вы ожидаете. Используйте “ленивые” квантификаторы (*?, +?, ??) при необходимости.
  • Используйте re.VERBOSE для написания более читаемых регулярных выражений, добавляя комментарии и пробелы.
  • Документация модуля re: https://docs.python.org/3/library/re.html

Регулярные выражения могут быть сложными, но, освоив их, вы получите мощный инструмент для работы с текстом. Начните с простых примеров и постепенно переходите к более сложным задачам.