以下代码按预期工作。但我有一个问题:
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]*)
不匹配Harry Rogers
贪婪?为什么尝试尽可能匹配([\w\s]*)(\s)
答案 0 :(得分:1)
但为什么
([\w\s]*)
与Harry Rogers
贪婪不匹配?
在第一个捕获组中Rogers
之后不包括四个空格,因为在对第一个模式满意后,空格字符必须在另一个组中匹配。
这意味着[\w\s]*
will match up to @
字符会回溯以匹配h
harri
之后的空格字符。使用Harry Rogers
(三个空格字符)留下第一个捕获组。
答案 1 :(得分:0)
这是因为(\ s)表示如果你希望group(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())