Python regex电子邮件地址

2024-10-01 09:31:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

可能的电子邮件地址

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

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

^{pr2}$

这是一个以a-z或0-9开头的字符串,后面是零个或更多的特殊字符。在

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

但它失败了

"john5.a.smith@gmail.com"

Tags: com列表admin电子邮件地址johngmailsmith
2条回答

这是一件棘手的事情,很难或不可能正确地处理正则表达式,因为它很快就会失控。在设计过滤器时,你必须权衡对误报和漏报的关注,并根据自己的喜好做出任何决定。认为这种过滤器能100%工作是不正确的。

根据您的要求,您应该决定:

  1. 积极过滤,对一些人没有收到你的电子邮件,或者
  2. 根本不过滤,但删除从邮件列表中跳出的地址。在

同样,这取决于您的需求,但我建议不要过滤。即使在电子邮件声誉受到关注的情况下,除非你发送的电子邮件地址是好的和坏的,否则这是更好的选择。在


证明这一事实的几点

与你发布的不同:

  1. admin@gmail.com是非法地址
  2. postmaster.@gmail.com将接收邮件。在

这表明,要把这类事情做好是非常困难的。我认为你不应该这么做。即使是“简单”和“显而易见”的事情,在电子邮件®这个古怪的世界里也不例外。

  1. 需要注意的是dots don't matter in gmail addresses。在

    Gmail doesn't recognize dots as characters within usernames, you can add or remove the dots from a Gmail address without changing the actual destination address; they'll all go to your inbox, and only yours. In short:

    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)、破折号(-)、下划线(Uu)、撇号(')和句点(.) 如果决定使用regex过滤器,则允许在用户名中使用这些组合。还有加号('+'),可能还有一些我们没有考虑过的字符。在
    • 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将很高兴地交付给{}。在

改用这个:

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

在Regex101.com上测试:

enter image description here

相关问题 更多 >