2012-07-26 180 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