正则表达式正在使用regexpal而不是Python

时间:2012-07-26 06:56:40

标签: python regex

我正在尝试编写一个正则表达式来捕获电子邮件ID。使用regexpal.com测试了几个小时。在网站上,它能够捕获所有的电子邮件ID。当我在Python中替换相同的正则表达式并执行re.findall(pattern,line)时,它无法捕获它。

正则表达式:

[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:*example.young@stackoverflow.edu*\>*example.young@stackoverflow.edu*</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:example.young@stackoverflow.edu>example.young@stackoverflow.edu</A>

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

问题是什么?

2 个答案:

答案 0 :(得分:1)

阅读re.findall的{​​{3}}:

  

如果模式中存在一个或多个组,则返回组列表

你的小组只捕获at符号,点等,因此这就是re.findall返回的所有内容。使用非捕获组,将整个事物包装在一个组中,或使用re.finditer

(如@Igor Chubin所述,您的正则表达式也错误地使用.而不是\.,但这不会导致主要问题。)

答案 1 :(得分:0)

您必须在此使用\.而不是.

(.|dot)

如果您只想说您可以在字母之间使用连字符 在edu部分中,您可以在不使用斜杠和分组的情况下执行此操作:

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

如果仅使用()对符号进行分组(但不是用于捕获), 您必须使用(?:)代替:

(?:@|at)