Как документы для re.search () говорят:
Просматривать строку в поисках местоположения first , где шаблон регулярного выражения создаетсопоставить и вернуть соответствующий объект сопоставления.Вернуть None, если ни одна позиция в строке не соответствует шаблону;обратите внимание, что это отличается от поиска совпадения нулевой длины в некоторой точке строки.
(выделено мной)
Ваш первый RegEx x*
соответствует нулю илибольше символа x
.Из всех матчей возвращается первый.Ваш шаблон соответствует началу вашей строки, потому что это zero 'x's
.Следовательно, ваше совпадение начинается и заканчивается в позиции 0 (<re.Match object; span=(0, 0), match=''>
).
При поиске x+
это означает один или несколько символов x
.Единственное x
в вашей строке находится в позиции 2
(третий символ, но мы начинаем считать с 0).Это один символ в длину, поэтому он заканчивается на позиции 3. Следовательно, ваш результат <re.Match object; span=(2, 3), match='x'>
.
Если вы посмотрели все матчи, а не только первый, вы бы увидели и другие матчи!Вы можете сделать это, например, используя re.findall ()
Пример:
>>> re.findall(r'x+', 'abxb')
['x']
>>> re.findall(r'x*', 'abxb')
['', '', 'x', '', '']
Как видите, совпадение ноль или более означает, что мы сопоставляем все несуществующие символы между нашими буквами тоже!Эта функция, равная нулю или более, гораздо полезнее в сочетании с другими шаблонами, т. Е. Если мы хотим сказать, что символ или слово необязательно в нашем сопоставлении.Допустим, мы хотели сопоставить все b
с, за которыми следует ноль или более x
es:
>>> re.findall(r'bx*', 'abxb')
['bx', 'b']