Книга: PyNEng
Назад: Специальные символы
Дальше: Группировка выражений

Жадность символов повторения

Жадность символов повторения

По умолчанию символы повторения в регулярных выражениях жадные (greedy). Это значит, что результирующая подстрока, которая соответствует шаблону, будет наиболее длинной.

Пример жадного поведения:

In [1]: import re In [2]: line = '<text line> some text>' In [3]: match = re.search('<.*>', line)  In [4]: match.group() Out[4]: '<text line> some text>' 

То есть, в данном случае выражение захватило максимально возможный кусок символов, заключенный в <>.

Если нужно отключить жадность, достаточно добавить знак вопроса после символов повторения:

In [5]: line = '<text line> some text>'  In [6]: match = re.search('<.*?>', line)  In [7]: match.group() Out[7]: '<text line>' 

Зачастую жадность наоборот полезна. Например, без отключения жадности последнего плюса, выражение \d+\s+\S+ описывает такую строку:

In [8]: line = '1500     aab1.a1a1.a5d3    FastEthernet0/1'  In [9]: re.search('\d+\s+\S+', line).group() Out[9]: '1500     aab1.a1a1.a5d3' 

Символ \S обозначает все, кроме whitespace. Поэтому выражение \S+ с жадным символом повторения описывает максимально длинную строку до первого whitespace символа. В данном случае - до первого пробела.

Но если отключить жадность, результат будет таким:

In [10]: re.search('\d+\s+\S+?', line).group() Out[10]: '1500     a' 
Назад: Специальные символы
Дальше: Группировка выражений