Регулярные выражения (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
Регулярные выражения могут быть сложными, но, освоив их, вы получите мощный инструмент для работы с текстом. Начните с простых примеров и постепенно переходите к более сложным задачам.