我正在尝试编写一个正则表达式来捕获电子邮件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', '.', '', '', '', '')]
问题是什么?
答案 0 :(得分:1)
阅读re.findall
的{{3}}:
如果模式中存在一个或多个组,则返回组列表
你的小组只捕获at符号,点等,因此这就是re.findall返回的所有内容。使用非捕获组,将整个事物包装在一个组中,或使用re.finditer
。
(如@Igor Chubin所述,您的正则表达式也错误地使用.
而不是\.
,但这不会导致主要问题。)
答案 1 :(得分:0)
您必须在此使用\.
而不是.
:
(.|dot)
如果您只想说您可以在字母之间使用连字符
在edu
部分中,您可以在不使用斜杠和分组的情况下执行此操作:
e-?d-?u-?[.,]?
如果仅使用()
对符号进行分组(但不是用于捕获),
您必须使用(?:)
代替:
(?:@|at)