РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
Обработка текстов по шаблону в Python
Модуль re
2
Первый поиск по шаблону
Функция search ищет первое вхождение шаблона в строке. Если совпадение найдено, возвращается специальный объект Match.
3
Что такое регулярное выражение?
Регулярное выражение (шаблон, паттерн) — это последовательность символов, определяющая правило поиска в тексте.
Состоит из:
Метасимволы: . ^ $ * + ? { } [ ] \ | ( )
4
Основные функции модуля re
5
Функция | Описание |
search(pattern, string) | Ищет первое вхождение шаблона |
match(pattern, string) | Ищет совпадение в начале строки |
findall(pattern, string) | Находит все вхождения, возвращает список |
finditer(pattern, string) | Итератор по всем вхождениям (объекты Match) |
sub(pattern, repl, string) | Заменяет найденные фрагменты |
split(pattern, string) | Разделяет строку по шаблону |
compile(pattern) | Компилирует шаблон для многократного использования |
Символьные классы
Позиционирование символов в шаблоне
6
Класс | Значение | Пример |
[abc] | Один из символов a, b или c | [abc] найдет 'a' в "арбуз" |
[a-z] | Любая латинская строчная буква | [a-z]+ найдет слово из латиницы |
[0-9] | Любая цифра | [0-9]{3} найдет три цифры подряд |
[а-яё] | Любая русская буква | [а-яё]+ найдет русское слово |
[^abc] | Любой символ, кроме a, b или c | [^0-9] найдет не-цифру |
Предопределенные множества
Параметры: сокращения для часто используемых классов
7
Символ | Значение | Эквивалент |
\d | Любая цифра | [0-9] |
\D | Любой нецифровой символ | [^0-9] |
\w | Буква, цифра или подчеркивание | [a-zA-Z0-9_] |
\W | Не буква, не цифра, не подчеркивание | [^a-zA-Z0-9_] |
\s | Любой пробельный символ | [ \t\n\r\f\v] |
\S | Непробельный символ | [^ \t\n\r\f\v] |
. | Любой символ, кроме перевода строки | — |
Квантификаторы
8
Сколько раз повторяется элемент?
Квантификатор | Значение |
* | 0 или более раз |
+ | 1 или более раз |
? | 0 или 1 раз |
{n} | Ровно n раз |
{n,} | n или более раз |
{n,m} | От n до m раз |
Якоря и границы слов
9
Якоря указывают на позицию в строке, а не на символы:
Пример:
Группировка
10
Круглые скобки ( ) выполняют две задачи:
Обработка найденного
Текст, выведенный Label, нельзя редактировать!
11
Объект Match
Что мы получаем после search или match?
12
Метод | Что возвращает |
group(0) | Всю найденную строку |
group(1) | Первую захваченную группу |
groups() | Кортеж всех захваченных групп |
start() | Индекс начала вхождения |
end() | Индекс конца вхождения |
span() | Кортеж (start, end) |
Флаги (модификаторы)
Флаги передаются как третий аргумент в функции re:
13
Флаг | Значение |
re.IGNORECASE (re.I) | Игнорировать регистр |
re.MULTILINE (re.M) | ^ и $ работают для каждой строки |
re.DOTALL (re.S) | Точка включает перевод строки |
re.VERBOSE (re.X) | Шаблон с пробелами и комментариями |
Пример:
Замена текста
14
Метод sub
С помощью re.sub можно не только заменять, но и удалять текст (замена на пустую строку).
Разделение строки
15
Метод split
Метод split разделяет строку по заданному шаблону, в отличие от обычного split(), который работает только с одним разделителем.
Компиляция шаблона
16
Для многократного использования
Компиляция ускоряет работу при многократном использовании одного шаблона.
Например: проверка email
17
Задача 1
Написать программу, которая:
■ Запрашивает у пользователя строку
■ Проверяет, содержит ли строка только цифры
■ Выводит "Да, это число", если строка состоит только из цифр, иначе "Нет, это не число"
2
Решение
19
Задача 2
Написать программу, которая:
■ Принимает на вход строку
■ Находит и выводит все слова, начинающиеся с заглавной буквы
■ Слова могут быть разделены пробелами, запятыми или точками
2
Решение
21
Еще примеры шаблонов
22
Что ищем | Шаблон |
Номер телефона (РФ) | \+7 \d{3} \d{3}-\d{2}-\d{2} |
[\w.-]+@[\w.-]+\.[a-z]{2,} | |
Дата (ДД.ММ.ГГГГ) | \d{2}\.\d{2}\.\d{4} |
IP-адрес | \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} |
Слова из 5 букв | \b\w{5}\b |
HEX-цвет (#RGB) | #[0-9A-Fa-f]{6} |
Полезные ресурсы:
23
■ Regex101 — онлайн-конструктор и отладчик regex
https://regex101.com/
■ Документация Python re
https://docs.python.org/3/library/re.html
■ Шпаргалка по регулярным выражениям
(можно найти в интернете по запросу "regex cheatsheet")
СПАСИБО ЗА ВНИМАНИЕ!
29