为什么正则表达式在这里并不贪心

时间:2018-04-02 09:52:54

标签: 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   

但为什么([\w\s]*)不匹配Harry Rogers 贪婪?为什么尝试尽可能匹配([\w\s]*)(\s)

2 个答案:

答案 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())