- en
- Language: ru
- Documentation version: latest
Жадность символов повторения
По умолчанию символы повторения в регулярных выражениях жадные (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
обозначает все, кроме пробельных символов. Поэтому выражение
\S+
с жадным символом повторения описывает максимально длинную
строку до первого whitespace символа. В данном случае - до первого
пробела.
Если отключить жадность, результат будет таким:
In [10]: re.search('\d+\s+\S+?', line).group()
Out[10]: '1500 a'