Python 为什么正则表达式在这里不贪婪

Python 为什么正则表达式在这里不贪婪,python,regex,python-3.x,Python,Regex,Python 3.x,下面的代码按照我的预期工作。但我有一个问题: import re names_email="Harry Rogers harri@yahoo.com" name_match=re.compile("([\w\s]*)(\s)([\w.]*@[\w.]*)") name=re.search(name_match,names_email) print (name.group(3)) print(name.group(1)) harri@yahoo.com Harry Rogers

下面的代码按照我的预期工作。但我有一个问题:

import re

names_email="Harry Rogers    harri@yahoo.com"

name_match=re.compile("([\w\s]*)(\s)([\w.]*@[\w.]*)")
name=re.search(name_match,names_email)
print (name.group(3))
print(name.group(1))

harri@yahoo.com
Harry Rogers   
但是为什么
([\w\s]*)
哈利·罗杰斯的贪婪不相称呢?为什么它试图尽可能地匹配
([\w\s]*)(\s)

,这是因为(\s)指示它只匹配一个空格如果您希望组(1)只匹配“Harry Rogers”而不匹配尾随空格,则代码应如下所示:

import re

names_email = "Harry Rogers    harri@yahoo.com"

name_match = re.compile("([\w\s]*?)([\s]+)([\w.]*@[\w.]*)")
name = re.search(name_match, names_email)
print(name.groups())
但是为什么
([\w\s]*)
哈利·罗杰斯的贪婪不相称呢


它在第一个捕获组中的
Rogers
之后不包含四个空格,因为在满足第一个模式后,空格字符必须在另一个组中匹配


这意味着
[\w\s]*
@
字符,然后回溯以匹配
hari
中紧跟在
h
之后的空格字符。用Harry Rogers(三个空格字符)离开第一个捕获组。

尝试了
print(“{}}}.”格式(name.group(1))
。它包括
Rogers
之后的空格。我想你的意思是正则表达式是
name\u match=re.compile(([\w\s]*)([\w\.]*@[\w\.]*)”
在第一个捕获组中,它不包括
Rogers
之后的四个空格,因为空格字符必须在另一个组中匹配。虽然第一组匹配所有4个空格,但它会在后面回溯以匹配所需的空格。正则表达式主要是贪婪的,直到它偶然发现其后续标记中的一个字符,贪婪匹配后的占位符优先于贪婪正则表达式本身;想象一只前面有很多胡萝卜的兔子;你给兔子设置了贪婪的正则表达式,兔子站起来吃掉了所有的正则表达式,现在如果你设置兔子为贪婪但跳过了白胡萝卜,兔子就不会吃白胡萝卜,贪婪的功能在那一刻占据着优先权。