我正在尝试使用python
中的以下代码匹配html文本中的电子邮件my_second_pat = '((\w+)( *?))(@|[aA][tT]|\([aA][tT]\))(((( *?)(\w+)( *?))(\.|[dD][oO][tT]|\([dD][oO][tT]\)))+)([eE][dD][uU]|[cC][oO][mM])'
matches = re.findall(my_second_pat,line)
for m in matches:
s = "".join(m)
email = "".join(s.split())
res.append((name,'e',email))
当我在line = shoham@stanford.edu
我明白了:
[('shoham', 'shoham', '', '@', 'stanford.', 'stanford.', 'stanford', '', 'stanford', '', '.', 'edu')]
我的期望:
[('shoham','@', 'stanford.', 'edu')]
它在regexpal.com上匹配为一个字符串,所以我想我遇到了re.findall
我是regex和python的新手。欢迎任何优化/修改。
答案 0 :(得分:1)
它匹配所有捕获组,其中包含可选匹配项。
((?:(?:\w+)(?: *?))(?:@|[aA][tT]|\(?:[aA][tT]\))(?:(?:(?:(?: *?)(?:\w+)(?: *?))(?:\.|[dD][oO][tT]|\(?:[dD][oO][tT]\)))+)(?:[eE][dD][uU]|[cC][oO][mM]))
答案 1 :(得分:1)
试试这个:
(?i)([^@\s]{2,})(?:@|\s*at\s*)([^@\s.]{2,})(?:\.|\s*dot\s*)([^@\s.]{2,})
如果您需要限制为.com
和.edu
:
(?i)([^@\s]{2,})(?:@|\s*at\s*)([^@\s.]{2,})(?:\.|\s*dot\s*)(com|edu)
请注意,我在正则表达式的开头使用了不区分大小写的标记(?i)
,而不是使用[Ee]
之类的语法。