2013-03-01 144 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