+?знак все еще работает в жадной манере - PullRequest
0 голосов
/ 16 декабря 2018

, когда я запускаю команды python, как показано ниже:

z='From stephen.marquard@uct.ac.za Sat Jan  5 09:14:16 2008'
print(re.findall('\S+@\S+',z))

Я получаю

['stephen.marquard@uct.ac.za']

И когда я запускаю его снова, добавляя ? как:

z='From stephen.marquard@uct.ac.za Sat Jan  5 09:14:16 2008'
print(re.findall('\S+@\S+?',z))

Я получаю

['stephen.marquard@u']

Теперь я хочу распечатать ['d@uct.ac.za'], поэтому я запустил:

z='From stephen.marquard@uct.ac.za Sat Jan  5 09:14:16 2008'
print(re.findall('\S+?@\S+',z))

Однако я получил:

['stephen.marquard@uct.ac.za']

Я думал, что получу ['d@uct.ac.za'], так как ? делает + несмешным.Почему я не прав?

1 Ответ

0 голосов
/ 16 декабря 2018

Когда вы делаете:

re.findall('\S+?@\S+',z)

, он начинается с начала попытки быть как можно менее жадным до тех пор, пока не найдет '@', а затем оставшиеся.'\S+?@' просто берет все символы от начала до '@'.

В случае '\S+@\S+?' вы не даете ничего справа от ?, что означает, что регулярное выражение более нежадный - принимает ровно один.

Предположим, что если вы дадите как '\S+?@\S+?\.' (точка после ?), он следует правилу, аналогичному первому сценарию, - попытается быть как можно менее жадным доон видит . (точка).

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