Python正则表达式电子邮件地址

时间:2015-05-12 15:07:42

标签: python regex

我有一个电子邮件地址列表,我想检查它们是否是GMail的有效电子邮件地址。

可能的电子邮件地址

"admin@gmail.com"
"john.smith@googlemail.com"
"john5.a.smith@gmail.com"
"jane_doe@googlemail.com"
"patrick.o'reilly@gmail.com" 

但以下不是有效的电子邮件地址

".admin@gmail.com"
"postmaster.@gmail.com"

这就是我所拥有的字符串,以a-z或0-9开头,后跟零或更多任何特殊字符。

re.search("^[a-z0-9]+[\.'\-]*[a-z0-9]+@(gmail|googlemail)\.com$", s)

但是它失败了

"john5.a.smith@gmail.com"

2 个答案:

答案 0 :(得分:2)

这是一个棘手的事情,并且很难或不可能正确地使用正则表达式,因为它很快失控。在设计过滤器时,您将不得不权衡对假阳性和阴性的担忧,并根据您的喜好做出任何决定。 认为这种过滤器在100%的时间都能正常工作是不正确的。

根据您的要求,您应该做出以下决定:

  1. 积极过滤,一些人没有收到您的电子邮件,或
  2. 根本不过滤,但删除从邮件列表中退回的地址。
  3. 它再次取决于您的要求,但我建议不要过滤。即使在电子邮件声誉受到关注的情况下,除非您向相同数量的好地址和坏地址发送电子邮件,否则这是更好的选择。

    证明这一事实的几点

    与您发布的内容不同:

    1. admin@gmail.com是非法地址
    2. postmaster.@gmail.com会收到邮件。
    3. 这表明很难做到这样的事情。那(在我看来)你不应该尝试。 即使是“简单”和“明显”的东西,通常也只是在古怪的电子邮件世界中。

      1. 重要的是要注意dots don't matter in gmail addresses

          

        Gmail无法将点识别为用户名中的字符,您可以   在不更改地址的情况下添加或删除Gmail地址中的点   实际目的地址;他们都会去你的收件箱,而且只是   你的。简而言之:

        homerjsimpson@gmail.com = hom.er.j.sim.ps.on@gmail.com
        homerjsimpson@gmail.com = HOMERJSIMPSON@gmail.com
        homerjsimpson@gmail.com = Homer.J.Simpson@gmail.com
        

        对我的个人电子邮件进行快速测试已确认电子邮件已发送 前导点或尾随点遵循这一原则:

        homerjsimpson@gmail.com = .homerjsimpson@gmail.com
        homerjsimpson@gmail.com = homerjsimpson.@gmail.com
        homerjsimpson@gmail.com = homerjsimpson.....@gmail.com
        

        工作,并交付。

      2. 您必须区分有效的Gmail用户名和有效的Gmail地址。它们不是一回事。 仅仅因为您无法使用某些字符串注册用户名并不意味着在@gmail.com前放置相同的字符串将不会发送电子邮件。

        其他一些观点:

        • 用户名必须至少为6个字符。这意味着 admin@gmail.com实际上是非法地址bob@gmail.com等根据本指南也是非法的,虽然“显然是合法的”。
        • 用户名可以包含字母(a-z),数字(0-9),短划线( - ),下划线(_),撇号(')和句点(。)你应该 如果您决定使用正则表达式过滤器,请在用户名中允许这些内容的任意组合。还有加号('+'),可能还有其他一些我们没有考虑的字符。
        • There are also max-length of username, total length of address constraints, and other constraints on emails in general.
        • 加号不是Gmail 用户名的合法部分,但可以包含在gmail 地址中。 homerjsimpson+stackoverflow@gmail.com很高兴地传递给homerjsimpson@gmail.com

答案 1 :(得分:1)

请改用:

^[a-z0-9]+[\.'\-a-z0-9_]*[a-z0-9]+@(gmail|googlemail)\.com$

在Regex101.com上测试:

enter image description here