2013-03-01 114 views
0

我想从我的正则表达式匹配返回2个亚组:Python的正则表达式:后向引用匹配的正则表达式组

email_add = "[email protected] <[email protected]>" 
m = re.match(r"(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b) <(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b)", email_add) 

但它似乎并不匹配:

>>> m.group() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'group' 

我怀疑我可能没有正确分组或正在使用不正确的单词边界。我试过\ w而不是\ b,但结果是一样的。

有人请指出我的错误。

+0

您的正则表达式与字符串不匹配。你需要不区分大小写的匹配。 – nhahtdh 2013-03-01 17:10:56

+0

'[A-Z]'不匹配小写字母。我建议逐步构建正则表达式。并随时扩展字符串,方法很容易找到基本错误。 – ted 2013-03-01 17:12:47

回答

2

您匹配大写字母A-Z,所以字符序列ohnoecom事业模式不匹配任何东西。

添加re.I不区分大小写的标志,使你的模式工作:

>>> import re 
>>> email_add = "[email protected] <[email protected]>" 
>>> re.match(r"(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b) <(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b)", email_add) 
>>> re.match(r"(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b) <(\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b)", email_add, re.I) 
<_sre.SRE_Match object at 0x1030d4f10> 
>>> _.groups() 
('[email protected]', '[email protected]') 

,或者你可以添加a-z到字符类来代替:

>>> re.match(r"(\b[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b) <(\b[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b)", email_add) 
<_sre.SRE_Match object at 0x1030d4f10> 
>>> _.groups() 
('[email protected]', '[email protected]') 
+0

D'oh!优秀!谢谢Martijn :) – 2013-03-01 21:09:03

2

与您正则表达式已经指出了什么问题,但你也可以考虑email.utils.parseaddr

>>> from email.utils import parseaddr 
>>> email_add = "[email protected] <[email protected]>" 
>>> parseaddr(email_add) 
('', '[email protected]') # doesn't get first part, so could assume it's same as 2nd? 
>>> email_add = "John Doe <[email protected]>" 
>>> parseaddr(email_add) 
('John Doe', '[email protected]') # does get name and email 
+0

感谢Jon,我不会轻易地在那个整齐的模块中单独发现。 – 2013-03-01 21:13:45