Уроки модуля (3/4)
Группы без захвата: `(?:...)`
Часто круглые скобки нужны только для группировки (количественной оценки, чередования)
и НЕ для извлечения значения. В этом случае используйте без захвата
версия: (?:...). Он работает идентично (...), но не создает
нумерованная группа.
Pattern: (?:https?)://(\w+\.\w+)
Sample: https://example.com e http://test.org
Match e gruppi:
match = "https://example.com" gruppo1 = "example.com"
match = "http://test.org" gruppo1 = "test.org"(?:https?) группирует схему для применения квантора ?, но мы
не заинтересован в извлечении https как группы: группа 1 является непосредственно
домен.
Зачем это использовать
- Читаемость: читатель сразу понимает, что группа существует только для структуру, а не для извлечения значения.
- Производительность: движку не нужно сохранять совпадение группы.
- Чистая нумерация: пронумерованные группы остаются на одном уровне. «информация, которая мне действительно нужна», без вмешательства.
Оптимизация с помощью групп без захвата
Использование (?:...) указывает механизму применять правила группировки и квантификатора без траты памяти на хранение промежуточных результатов сопоставления. Это настоятельно рекомендуется при тяжелых циклах или очень длинной обработке текста.
Попробуйте это
Извлеките домен (example.com, test.org…) из каждого URL-адреса в тексте. Используйте `(?:https?)` для протокола (нет необходимости его захватывать) и одну группу для домена.
Показать подсказку
Измените первую группу с (https?) на (?:https?): ее не нужно захватывать, вам нужен только домен.
Решение доступно после 3 попыток
Обзор упражнения
Найдите каждое повторение `ab` как одно совпадение, но БЕЗ захвата группы (поскольку вам нужно только все совпадение).
Показать подсказку
Тот же синтаксис, что и в предыдущем уроке, но с (?:ab)+ вместо (ab)+.
Решение доступно после 3 попыток
Дополнительная задача
Find price digits followed optionally by decimal parts inside a non-capturing group, e.g. `100` or `100.50`.
Показать подсказку
Использовать (?:\\.\\d{2})? чтобы сделать десятичную часть необязательной, не захватывая ее.
Решение доступно после 3 попыток