Я думаю, что регулярное выражение соответствует слева направо. Таким образом, первым шаблоном, который соответствует, является пустая строка до 7...
. Если он найдет 9
, он действительно будет соответствовать ему жадным: и попробуйте «поесть» (это правильная терминология) как можно больше символов.
Если вы запрашиваете:
>>> print(re.findall(r'9*',line));
['', '', '', '', '9999', '', '', '', '']
Это соответствует все пустые строки между символами и, как вы можете видеть, 9999
подобран, а также.
Основная причина, вероятно, в производительности: если вы ищете шаблон в строке из символов 10M +, вы очень счастливы, если шаблон уже находится в первых десятизначных символах. Вы не хотите тратить усилия на поиске «красивых» матч ...
EDIT
С 0 или больше появления один означает группу (в данном случае 9
) повторяется ноль или более раз. В пустой строке символы повторяются ровно 0 раз. Если вы хотите, чтобы соответствовать моделям, где символы повторяются один или несколько раз, вы должны использовать
9+
Это приводит к:
>>> print(re.search(r'9+', line));
<_sre.SRE_Match object; span=(4, 8), match='9999'>
re.search
для шаблона, который принимает пустую строку, являешься вероятно, не так уж полезно, поскольку он всегда будет соответствовать пустой строке до фактического начала строки.
Почему вы вставили скриншот своего вопроса в свой вопрос? Это не имеет никакого отношения к этому вопросу. Если у вас есть вопрос о StackOverflow, отправьте его в [Meta StackOverflow] (http://meta.stackoverflow.com/), а не в середине несвязанного вопроса. – abarnert