2012-03-17 78 views
1

我正在使用正則表達式編寫python程序來查找電子郵件地址。每當我嘗試使用圓括號進行分組時,re.findall函數都會給出錯誤的輸出。任何人都可以指出錯誤/建議一個替代解決方案?re.findall在Python中使用分組無法正則表達式

這裏有兩個代碼片段來解釋 -

pat = "[\w]+[ ]*@[ ]*[\w]+.[\w]+" 
re.findall(pat, '[email protected] .rtrt.. [email protected] ') 

使輸出

['[email protected]', '[email protected]'] 

但是,如果我用這個表達式分組和修改代碼,

pat = "[\w]+[ ]*@[ ]*[\w]+(.[\w]+)*" 
re.findall(pat, '[email protected] .rtrt.. [email protected] ') 

輸出爲

['.com', '.com'] 

爲了確認正則表達式的正確性,我在http://regexpal.com/中用相同的輸入字符串嘗試了這個特定的正則表達式(在第二個例子中),並且兩個電子郵件地址都匹配成功。

+0

+1用於極好被問到的問題。 – 2012-03-17 08:10:49

+0

你已經在所有你不應該擁有的地方使用過角色類,並且沒有使用你應該擁有(或使用過逃逸)的角色類。此外,該正則表達式在大量有效地址上失敗,如'anu.agg @ test.com'。我期望在'@'周圍允許空格(這當然是無效的)是有意完成的? – 2012-03-17 08:11:17

回答

3

在Python中,re.findall僅在沒有組的情況下返回整個匹配,如果有組,則返回組。爲了解決這個問題,你應該使用一個非捕獲組(?:...)。在這種情況下:

pat = "[\w.]+ *@ *\w+(?:\.\w+)*" 
re.findall(pat, '[email protected] .rtrt.. [email protected] ') 
+0

您已經複製了@ anu.agg原始正則表達式中的所有錯誤。一個稍微好一點的版本(儘管仍然遠不及最優)會是''[\ w。] + * @ * \ w +(?:\。\ w +)*「'。 – 2012-03-17 08:12:27

+0

@TimPietzcker,哦,是的,我只是在沒有正確思考的情況下修改了組。更換。 – huon 2012-03-17 13:16:32

1

,如果你想做一些像獨立於主機的用戶,您將使用羣體:
(連字符是可選的,有些郵件有他們。)

pat = '([\w\.-]+)@([\w\.-]+)' 
re.findall(pat, '[email protected] .rtrt.. [email protected] ') 

輸出:

[('abc', 'cs.stansoft.edu.com'), ('myacc', 'gmail.com')] 

爲了進一步舉例說明,我們可以替換主機,並保持用戶從組1(\ 1):

emails = '[email protected] .rtrt.. [email protected] ' 
pat = '([\w\.-]+)@([\w\.-]+)' 
re.sub(pat, r'\[email protected]', emails) 

輸出:

'[email protected] .rtrt.. [email protected] ' 

只需從模式刪除括號整個電子郵件匹配:

pat = '[\w\.-][email protected][\w\.-]+' 
re.findall(pat, '[email protected] .rtrt.. [email protected] ') 

輸出:

['[email protected]', '[email protected]']