Шаблон r'h+'
и r'h*'
не идентичны, поэтому они не дают одинакового результата.+
подразумевает 1 или более совпадений вашего паттерна, *
ноль или более:
re.search
не возвращает «ничего», потому что он смотрит только на первое совпадение. first match для *
является нулевым вхождением вашего паттерна '(ha)'
в первой букве вашей строки:
import re
x=re.compile(r'(ha)*')
c=x.findall('the man know how to hahahaha') # get _all_ matches
print(c)
Выход:
['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'ha', '']
# t h e m a n k n o w h o w t o hahahaha
*
и ?
квантификатор допускает 0 совпадений
Доку:
Pattern.search (string [, pos [, endpos]])
Просматривать строку в поисках первого местоположения, в котором это регулярное выражение дает совпадение, ...
(источник: https://docs.python.org/3/library/re.html#re.Pattern.search)