Регулярные выражения
Определение
Raw строки
F строки
RF строки
Синтаксис
Квантификаторы (повторы)
Группы и извлечение данных
Группы и извлечение данных
Группы и извлечение данных
Группы и извлечение данных
Модуль re в Python
Модуль re в Python
Модуль re в Python
Модуль re в Python
group()
group()
group()
group()
Ошибки при использовании group()
Модуль re в Python
Жадный (Greedy) vs. Ленивый (Lazy) поиск
Жадный (Greedy) vs. Ленивый (Lazy) поиск
Жадный (Greedy) vs. Ленивый (Lazy) поиск
Проверки (Lookahead/Lookbehind)
Проверки (Lookahead)
Проверки (Lookbehind)
528.60K
Категория: ПрограммированиеПрограммирование

Регулярные выражения (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
English     Русский Правила