Похожие презентации:
Регулярные выражения (2)
1. Регулярные выражения
2. Определение
Регулярные выражения(regular expressions, regex) - формальный язык,используемый в компьютерных программах, работающих с текстом, для поиска и
манипуляций с подстроками в тексте, основанный на использовании метасимволов.
Для поиска используется строка-образец, состоящая из символов и метасимволов
и задающая правило поиска. Для манипуляций с текстом дополнительно задаётся
строка замены, которая также может содержать в себе специальные символы.
3. Raw строки
'r'-строки (raw-строки)Префикс 'r' перед строкой означает, что это "сырая" строка (raw string).
В таких строках символы, обычно интерпретируемые как экранирующие, такие
как '\', остаются такими, какие они есть, и не обрабатываются как
спецсимволы. Это удобно для регулярных выражений, где часто используются
обратные слэши. Пример: r'\n' будет интерпретироваться как два символа
'\' и 'n', а не как символ новой строки.
4. F строки
'f'-строки (форматированные строки)Префикс f перед строкой указывает, что это форматированная строка. В таких
строках можно вставлять значения переменных или выражений, заключив их в
фигурные скобки {}. Например, если x = 10, то f "x is {x}" будет
преобразовано в строку "x is 10".
5. RF строки
'rf' -строки (комбинация raw и форматированных строк)Префикс 'rf' объединяет свойства как raw, так и форматированных строк.
Это позволяет использовать как "сырые" символы, так и подставлять значения
переменных. Например, в rf "Value: {value}\n", будет подставлено
значение переменной 'value', а '\n' останется как два отдельных символа.
6. Синтаксис
7. Квантификаторы (повторы)
8. Группы и извлечение данных
Круглые скобки () создают группу:Именованные группы (?P<name> …) :
9. Группы и извлечение данных
В регулярных выражениях (?: ... ) обозначает незахватывающуюгруппу (non-capturing group). Давайте разберёмся, зачем она нужна и
чем отличается от обычной группы ( ... )
Обычная группа ( ... ) vs. Незахватывающая (?: ... )
Группа
Захватывает совпадение?
Можно ссылаться
обратно?
Влияет на нумерацию
групп?
(x)
✅ Да (сохраняется
в match.group(1))
✅ Да (\1, $1)
✅ Да (увеличивает
счётчик групп)
(?:x)
❌ Нет (не сохраняется)
❌ Нет
❌ Нет (не влияет на
нумерацию)
10. Группы и извлечение данных
Зачем нужна (?: ... )(?: ... ) — это способ сказать регулярному выражению:
«Сгруппируй эти символы, но не запоминай их отдельно».
Это полезно для оптимизации и избежания лишних захватов.
11. Группы и извлечение данных
Зачем нужна (?: ... )• Группировка без захвата
Если нужно применить квантификатор (+, *, ?) к нескольким
символам, но не нужно сохранять результат для дальнейшего
использования.
• Экономия памяти и ускорение
Если в регулярке много групп, но некоторые не нужны для извлечения,
(?: ... ) уменьшает нагрузку.
• Игнорирование ненужных групп в обратных ссылках
Если используются обратные ссылки (\1, \2), (?: ... ) не
влияет на их нумерацию.
12. Модуль re в Python
13. Модуль re в Python
ФункцииОписание
re.compile(pattern, flags=0)
Собирает регулярное выражение в объект для
будущего использования в других re-функциях
re.match(pattern, string, flags=0)
Ищет pattern в начале строки string
re.fullmatch(pattern, string, flags=0)
Проверяет всю строку на соответствие шаблону
re.finditer(pattern, string, flags=0)
Ищет pattern по всей строке string. Возвращает
итератор, содержащий Match-объекты для каждого
найденного совпадения
14. Модуль re в Python
Отличие finditer() от findall() в Python (модуль re)Оба метода используются для поиска всех совпадений регулярного
выражения в строке, но работают по-разному.
Лучше использовать, если...
findall()
Нужен просто список совпадений, и данные небольшие.
finditer()
Нужны группы, позиции или работа с большими данными.
15. Модуль re в Python
Критерийfinditer()
findall()
Тип возвращаемого
значения
Итератор объектов Match (можно получать
группы через .group()).
Список строк или кортежей (если есть
группы).
Использование групп
Позволяет получать каждую группу
через match.group(1), match.group(2) и т. д.
Если есть группы — возвращает
кортежи. Если нет — строки.
Память
Экономит память (генерирует совпадения
«лениво»).
Сразу загружает все совпадения в
память (может быть проблемой для
больших данных).
Гибкость
Даёт доступ к позициям совпадений
(.start(), .end()).
Только сами совпадения, без позиций.
Именованные
группы
Поддерживает (можно
использовать match.group('name')).
Не поддерживает — возвращает
только числовые группы.
16. group()
В модуле re в Python метод group() используется для извлечения совпавшихподстрок из объекта Match, который возвращается функциями:
re.match()
re.search()
re.finditer()
17. group()
МетодВозвращает
group(0)
Всю совпавшую строку (аналог group() без аргументов).
group(1)
Первую группу, захваченную в ( ).
group(2)
Вторую группу и т. д.
group(N)
N-ную группу (если она есть в шаблоне).
group('name')
Группу по имени (если использовалось (?P<name>...)).
groups()
Кортеж всех захваченных групп (без group(0)).
groupdict()
Словарь именованных групп (если они есть).
18. group()
19. group()
20. Ошибки при использовании group()
21. Модуль re в Python
ФлагОписание
re.IGNORECASE (re.I)
Игнорирует регистр символов.
re.MULTILINE (re.M)
Изменяет поведение ^ и $:
^ — начало каждой строки (а не всего текста),
$ — конец каждой строки.
re.DOTALL (re.S)
Точка . теперь включает перенос строки \n (по умолчанию . не
включает \n).
re.ASCII (re.A)
Заставляет \w, \W, \b, \B, \d, \D, \s, \S работать только с ASCII (по
умолчанию в Python 3 они учитывают Unicode).
22. Жадный (Greedy) vs. Ленивый (Lazy) поиск
Принцип работы• Жадный поиск (по умолчанию) — пытается захватить максимально возможную часть строки.
• Ленивый поиск (добавляется ? после квантификатора) — ищет минимальное совпадение.
Когда использовать?
• Жадный
• Ленивый
-> Когда нужно захватить весь блок (например, многострочный текст).
-> Для точечного извлечения данных (HTML-теги, кавычки, логи).
23. Жадный (Greedy) vs. Ленивый (Lazy) поиск
Текст: <div>Content</div><div>More</div>• Жадный режим (.*):
re.findall(r'<div>.*</div>', text)
Результат:
['<div>Content</div><div>More</div>’]
(Захватил всё от первого <div> до последнего
</div>)
• Ленивый режим (.*?):
re.findall(r'<div>.*?</div>', text)
Результат:
['<div>Content</div>', '<div>More</div>’]
24. Жадный (Greedy) vs. Ленивый (Lazy) поиск
Текст: text = 'Слова: "hello", "world"'• Жадный режим (.*):
re.findall(r'"(.*)"', text)
Результат:
[‘hello", "world']
(Захватил всё между первой " и последней ")
• Ленивый режим (.*?):
re.findall(r'"(.*?)"', text)
Результат:
['hello', 'world']
(Нашел только содержимое внутри отдельных
кавычек)
25. Проверки (Lookahead/Lookbehind)
Позитивная проверка (lookahead assertion) — это механизм в регулярных выражениях,который позволяет проверить, соответствует ли текст определённому шаблону без включения
его в результат.
Существует два типа:
Позитивная проверка вперёд (Positive Lookahead) — (?=...)
Условие: "Текст должен сопровождаться шаблоном ...".
Позитивная проверка назад (Positive Lookbehind) — (?<=...)
Условие: "Текст должен предваряться шаблоном ...".
26. Проверки (Lookahead)
Задача: Найти слово Python, за которым следует 3.Регулярка: Python(?=\d)
Совпадения:
Python3 → найдёт Python (потому что после него есть цифра)
Python (без цифры) → не найдёт
27. Проверки (Lookbehind)
Задача: Найти число, перед которым стоит $.Регулярка: (?<=\$)\d+
Совпадения:
$100 → найдёт 100
€100 → не найдёт
Price: $200 → найдёт 200
Программирование