2012-07-26 318 views
0

我想寫一個正則表達式來捕獲電子郵件ID。自從使用regexpal.com幾個小時後進行測試。在網站上,它能夠捕捉所有的電子郵件ID。當我在Python中替換相同的正則表達式並執行re.findall(pattern,line)時,它無法捕捉它。正則表達式正則表達式正則表達式使用正則表達式,但不是與Python

正則表達式:

[a-zA-Z0-9-_]+[(.)?a-zA-Z0-9-_]*\s*(@|at)\s*[a-zA-Z0-9-_]+\s*(.|dot)\s*[a-zA-Z0-9-_]*\s*(.|dot)\s*e(\-)?d(\-)?u(\-)?(.,)? 

實施例:

Line = <TR> <TD><B>E-Mail: </B> <TD><A HREF=MailTo:*[email protected]*\>*[email protected]*</A> 

(上regexpal.com正確突出顯示)。

使用Python:

for line in f: 
    print 'Line = ',line 
     matches = re.findall(my_first_pat,line) 
    print 'Matches = ',matches 

給出輸出:

Line = <TR> <TD><B>E-Mail: </B> <TD><A HREF=MailTo:[email protected]>[email protected]</A> 

Matches = [('@', 'd', '.', '', '', '', ''), ('@', 'd', '.', '', '', '', '')] 

問題是什麼?

回答

1

the documentationre.findall

如果一個或多個組中存在的格局,迴歸羣體

列表您的組只捕獲at符號,點,等等,所以這就是re.findall返回的結果。要麼使用非捕獲組,要將整個事物包裝在一個組中,要麼使用re.finditer。 (正如@Igor出殯注意,您正則表達式也是用.代替\.錯誤,但這不會導致主要的問題)

+0

你能解釋一下我應該如何使用非捕獲組,或者將整個事物包裝在一個組中? – crazyaboutliv 2012-07-26 07:37:20

+0

有關信息,請查看任何正則表達式教程或參考,例如http://www.regular-expressions.info/。 – BrenBarn 2012-07-26 08:18:42

0

您必須使用\.沒有.這裏:

(.|dot) 

如果您只想說,你可以有字母 之間的連字符在edu部分,你可以做到這一點沒有斜線和分組:

e-?d-?u-?[.,]? 

如果您使用()只是爲了分組符號(但不是用於捕獲), 您必須使用(?:)代替:

(?:@|at) 
+0

該E(\ - )? ,我用它來防止電子郵件的格式爲[email protected]。 – crazyaboutliv 2012-07-26 07:18:26