Python Advance模式捕获电子邮件地址

时间:2014-11-04 05:06:10

标签: regex python-2.7 email-validation

我正在处理单个模式,以使用角度括号捕获正确的电子邮件地址。 根据以下情况,正确的电子邮件地址是在提供大括号或没有大括号时 进入了。

更正电子邮件地址格式: -


 1. <abc@gmail.co.in> , <abc@gmail.com> 
 2. abc@gmail.co.in , abc@gmail.com 

使用正确的电子邮件地址格式: -


 1. <abc@gmail.co.in 
 2. abc@gmail.com> 
 3. <abc@gmail>  
 4. <abcgmail.com> 
 5  <abc@gmail.com> 

捕获上述电子邮件地址的代码: -

&#39;&#39;&#39;

捕获电子邮件地址。允许打开和关闭角度支撑不正确的模式。 &#39;&#39;&#39;

import re
# Sub pattern "(?(id)[>])" is used to compare that if the group('id') has matched then expect the closing angular brace else not. 

pattern = r'(?P<id>[<])(\w+@\w+)((\.\w+)+)(?(id)[>])'
m = re.search(pattern,email,re.I)
if m:
    print "Correct Email:",m.group()
else:
    print "Incorrect Pattern!"    

上面的代码与带有角括号的电子邮件和给出不正确的括号时的情况正确匹配(例如:缺少打开/关闭括号)。

但是,当提供没有角括号的电子邮件时,该模式与案例不匹配。

1 个答案:

答案 0 :(得分:0)

只需使用两个正则表达式来匹配这两种类型的电子邮件地址(1,匹配既不在<之前也不在>符号后面的电子邮件地址2.以匹配电子邮件地址先于<,后跟>符号)。通过将两个正则表达式与| OR运算符组合,您将获得两者匹配的电子邮件。

>>> import re
>>> s = """<abc@gmail.co.in> <abc@gmail.com>   abc@gmail.co.in abc@gmail.com <abc@gmail> <abc@gmail.co.in  abc@gmail.com> """
>>> for i in re.findall(r'<\w+@\w+(?:\.\w+)+>|(?<!<)\b(?:\w+@\w+)(?:\.\w+)+\b(?!>)', s):
    print(i)


<abc@gmail.co.in>
<abc@gmail.com>
abc@gmail.co.in
abc@gmail.com

通过re.search功能。

>>> s = """<abc@gmail.co.in> <abc@gmail.com> abc@gmail.co.in abc@gmail.com <abc@gmail> <abc@gmail.co.in abc@gmail.com>"""
>>> for i in s.split():
    m = re.search(r'<\w+@\w+(?:\.\w+)+>|(?<!<)\b(?:\w+@\w+)(?:\.\w+)+\b(?!>)', i)
    if m:
        print("Correct Email : " + m.group())
    else:
        print ("Incorrect Pattern!")


Correct Email : <abc@gmail.co.in>
Correct Email : <abc@gmail.com>
Correct Email : abc@gmail.co.in
Correct Email : abc@gmail.com
Incorrect Pattern!
Incorrect Pattern!
Incorrect Pattern!

Explanation