Регулярные выражения (regex) - мощный инструмент для работы с текстом, позволяющий искать, извлекать и заменять подстроки по заданному шаблону.
Основные функции модуля re
1. Поиск совпадений
re.search(pattern, string)
- ищет первое совпадение с шаблоном в строкеre.match(pattern, string)
- ищет совпадение только в начале строкиre.fullmatch(pattern, string)
- проверяет, соответствует ли вся строка шаблону
2. Поиск всех совпадений
re.findall(pattern, string)
- возвращает список всех совпаденийre.finditer(pattern, string)
- возвращает итератор с объектами совпадений
3. Замена текста
re.sub(pattern, repl, string)
- заменяет все совпадения на replre.subn(pattern, repl, string)
- аналогично sub, но возвращает кортеж (новая_строка, количество_замен)
4. Разделение строки
re.split(pattern, string)
- разделяет строку по шаблону
Синтаксис регулярных выражений
Основные метасимволы
.
- любой символ, кроме новой строки^
- начало строки$
- конец строки*
- 0 или более повторений+
- 1 или более повторений?
- 0 или 1 повторение{n}
- ровно n повторений{n,}
- n или более повторений{n,m}
- от n до m повторений
Классы символов
[abc]
- любой из символов a, b или c[a-z]
- любой символ от a до z[^abc]
- любой символ, кроме a, b или c\d
- цифра (аналог [0-9])\D
- не цифра\s
- пробельный символ (пробел, табуляция, новая строка)\S
- не пробельный символ\w
- буквенно-цифровой символ или нижнее подчеркивание (аналог [a-zA-Z0-9_])\W
- не буквенно-цифровой символ
Группировка
( )
- создает группу(?: )
- не захватывающая группа (только для группировки)|
- логическое ИЛИ\1, \2
- ссылки на группы
Специальные последовательности
\b
- граница слова\B
- не граница слова\A
- начало строки (как ^, но в многострочном режиме работает иначе)\Z
- конец строки (как $, но в многострочном режиме работает иначе)
Флаги (модификаторы)
re.IGNORECASE
(re.I
) - игнорировать регистрre.MULTILINE
(re.M
) - многострочный режим (^ и $ работают для начала/конца каждой строки)re.DOTALL
(re.S
) - точка включает символ новой строкиre.ASCII
- \w, \W, \b, \B, \d, \D, \s, \S соответствуют ASCIIre.VERBOSE
(re.X
) - позволяет писать более читаемые regex с комментариями
Примеры использования
import re
# Поиск первого совпадения
match = re.search(r'\d+', 'abc 123 def')
if match:
print(match.group()) # 123
# Поиск всех совпадений
numbers = re.findall(r'\d+', '1, 2, 3, 4, 5')
print(numbers) # ['1', '2', '3', '4', '5']
# Замена текста
text = re.sub(r'\s+', ' ', 'Много пробелов здесь')
print(text) # 'Много пробелов здесь'
# Разделение строки
parts = re.split(r'[,;]\s*', 'one,two;three, four')
print(parts) # ['one', 'two', 'three', 'four']
# Использование групп
match = re.search(r'(\w+)@(\w+\.\w+)', 'user@example.com')
if match:
print(match.group(1)) # user
print(match.group(2)) # example.com
# Использование флагов
text = 'Python is great\npython is versatile'
matches = re.findall(r'^python', text, flags=re.IGNORECASE | re.MULTILINE)
print(matches) # ['Python', 'python']
Объекты совпадений (Match objects)
При успешном поиске возвращается объект Match с методами:
group()
- возвращает совпавшую подстрокуgroup(n)
- возвращает n-ю группуgroups()
- возвращает кортеж всех группstart()
- начальная позиция совпаденияend()
- конечная позиция совпаденияspan()
- кортеж (start, end)
Компиляция регулярных выражений
Для многократного использования шаблона его можно скомпилировать:
pattern = re.compile(r'\b\w{4}\b') # слова из 4 букв
matches = pattern.findall('This is a test string')
print(matches) # ['This', 'test']
Регулярные выражения - мощный инструмент, но сложные шаблоны могут быть трудными для чтения и отладки. Для сложных задач обработки текста иногда лучше использовать комбинацию строковых методов.
Задачи для закрепления материала по регулярным выраженим можно посмотреть тут
На самом деле, эта информация не более чем освежить в памяти что такое регулярные выражения -реально мощный инструмент как для решения задач так и для практики. Если вы хотите более подробно почитать, что такое регулярные выражения то вам на Хабр вот ссылка. Там потрясающая статья о регулярках, подробно полно плюс практика по ним. Да, статья 2018 года, но с этого момента ни чего не поменялось в них.