Чтобы увидеть разницу в поведении, давайте посмотрим вывод findall
для обоих регулярных выражений:
>>> print re.findall('[a-z]*', s)
['', '', '', 'abc', '']
>>> print re.findall('[0-9]*', s)
['123', '', '', '', '']
Как вы можете видеть с [a-z]*
, мы получаем 3 пустых соответствия перед соответствием abc
, то естьпричина search
возвращает пустое значение, поскольку возвращает первое совпадение.
Вы используете [a-z]*
(0 или более вхождений [a-z]
), оно соответствует даже пустой строке.Таким образом, мы получаем 3 пустых совпадения для первых 3 букв 1
, 2
, 3
и еще одно пустое совпадение в конце строки.
Однако для второго случая, поскольку первое совпадение равно 123
, мы получаемТо же самое возвращается функцией search
.
Когда мы используем +
, поведение квантификатора меняется на следующее:
>>> print re.findall('[0-9]+', s)
['123']
>>> print re.findall('[a-z]+', s)
['abc']
, возвращая нам одинаковое совпадение для обоих регулярных выражений, поскольку пустые совпадения невозможныТеперь.