Блог

Регулярные Выражения. Lazy and Greedy Search (Ленивый и жадный поиск)

Более подробно эта тема рассматривается в курсе 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

<<< Назад к началу статьи "Регулярные Выражения. Предисловие"