По умолчанию символы повторения в регулярных выражениях жадные (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'