Более подробно эта тема рассматривается в курсе Python Fundamentals
Если мы что-то ищем в строке с помощью регулярного выражения, то по-умолчанию производится широкий или “жадный” (greedy) поиск.
Рассмотрим пример. Допустим, мы хотим получить в тексте слова, ограниченные двойными кавычками:
Without "economic freedom", there can be no other "freedom".
Margaret Thatcher.
По идее, нам нужен паттерн, который начинается с первой кавычки, далее показывает любой символ (точка) и далее идёт квантификатор (плюс), который вмещает в себя один или более символов. И заканчивается всё это снова кавычками:
r ='\".+\"'
Однако, на деле оказывается, что это регулярное выражение выделяет значительно больше, чем предполагалось:
"economic freedom", there can be no other "freedom"
Почему? Потому что так работает алгоритм поиска совпадения в регулярном выражении.
Если не указано иное (то есть по умолчанию) алгоритм поиска работает от первого совпадения до конца текста. А затем, идёт посимвольно назад, до выполнения первого совпадения по условию поиска.
Поэтому, если мы хотим выделить два варианта, то нам нужен ленивый (lazy) поиск, где варианты перебираются до первого совпадения:
"economic freedom", "freedom"
Для этого после квантификатора + необходимо поставить знак вопроса ?:
r ='\".+?\"'
Это относится не только к знаку “плюс”, но и к другим квантификаторам:
Symbols | Their meaning: |
---|---|
+ | 1 or > characters |
* | 0 or > characters |
{min, } | nmin or > times |
{,max} | from 0 to nmax times |
{min, max} | from nmin to nmax times |