в регулярном выражении python, почему (h) * и (h) + не могут дать одинаковый результат? - PullRequest
2 голосов
/ 04 апреля 2019

Я изучаю модуль re на python. Я нашел что-то, что не имеет смысла (для меня), и я не знаю почему. Вот небольшой пример,

x=re.compile(r'(ha)*')
c=x.search('the man know how to hahahaha')
print(c.group())#output will be nothing,no error.But i expect "hahahaha"

то же самое происходит, если я использую re.compile(r'(ha)?'),

x=re.compile(r'(ha)?')
c=x.search('the man know how to hahahaha')
print(c.group())#output will be nothing,no error.But i expect "ha". 

Но если я использую re.compile(r'(ha)+'),

x=re.compile(r'(ha)+')
c=x.search('the man know how to hahahaha')
print(c.group())#output will be `hahahaha`,just as expected.

Почему это не re.compile(r'(ha)*') и re.compile(r'(ha)+') одинаковы в этом случае?

1 Ответ

1 голос
/ 04 апреля 2019

Шаблон 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...