仅限美国(希望)的电子邮件正则表达式(尝试使用' .jp或.co.uk"过滤域名)

时间:2015-01-12 16:03:10

标签: python regex

我正在使用当前的正则表达式匹配Python中的电子邮件地址:

EMAIL_REGEX = re.compile(r"[^@]+@[^@]+\.[^@]+")

这很好用,除了当我运行它时,我正在获得诸如'.co.uk'等域名。对于我的项目,我只是想获得一个国际的计数 TLD。我了解这并不一定能保证我的用户只是美国用户,但它确实给了我一些我没有国际TLD的用户(或者我们认为国际TLD的用户 - .co.uk,.jp等等) )。

1 个答案:

答案 0 :(得分:2)

你想要的是非常困难的。

如果我创建一个名为this.is.my.email.my-domain.com的邮件服务器和一个名为martin的帐户,我完全有效的美国电子邮件将是martin@this.is.my.email.my-domain.com。具有多个域名部分的电子邮件并不罕见(.gov是一个常见示例)。

取消来自.uk顶级域名的电子邮件也存在问题,因为许多美国人可能拥有.uk地址,例如他们认为这听起来不错,在英国的公司工作,有一个英国配偶,曾经住在英国,从未改变过电子邮件等等。

如果您只想要美国注册,您的选择是:

  • 询问您的用户是否为美国用户,如果他们向非美国国家/地区提供回复,请告知他们您的服务仅适用于美国用户。

  • 询问美国地址或电话号码。虽然这可能是伪造的,但要获得匹配的地址并不容易。例如,邮政编码。

  • 使用GeoIP,仅允许使用美国电子邮件地址。这不是万无一失的,因为人们可以在假期使用您的服务等。

在问题的评论中,你说:

  

如果某个人拥有.jp顶级域名或.co.uk,它是否有理由(相当准确)他们是国际性的,这没有意义吗?

通常,是的。但远非总是如此。我的女朋友有4个.uk电子邮件地址,她不再住在英国:-)这是你必须做出商业选择的地方,你可以:

  1. 拒绝潜在客户
  2. 加倍努力,让客户稍稍“陌生”#34;电子邮件地址
  3. 您的业务,您的选择; - )

    所以,有了这个序言,如果你必须这样做,你可以这样做:

    import re
    
    EMAIL_REGEX = re.compile(r'''
        ^             # Anchor to the start of the string
        [^@]+         # Username
        @             # Literal @
        ([^@.]+){1}   # One domain part
        \.            # Literal 1
        ([^@.]+){1}   # One domain part (the TLD)
        $             # Anchor to the end of the string
    ''', re.VERBOSE)
    
    print(EMAIL_REGEX.search('test@example.com'))
    print(EMAIL_REGEX.search('test@example.co.uk'))
    

    当然,这仍然允许您注册.nl地址。如果您只想允许某组TLD,请使用:

    allow_tlds = ['com', 'net'] # ... Probably more
    result = EMAIL_REGEX.search('test@example.com')
    if result is None or result.groups()[1] in allowed_tlds:
        print('Not allowed')
    

    但是,如果您要创建一个在线列表,那么您不再需要regexp,因为使用它将允许具有多域地址的美国人注册(例如@nlm.nih.gov)。