我正在使用当前的正则表达式匹配Python中的电子邮件地址:
EMAIL_REGEX = re.compile(r"[^@]+@[^@]+\.[^@]+")
这很好用,除了当我运行它时,我正在获得诸如'.co.uk'等域名。对于我的项目,我只是想获得一个国际的计数 TLD。我了解这并不一定能保证我的用户只是美国用户,但它确实给了我一些我没有国际TLD的用户(或者我们认为国际TLD的用户 - .co.uk,.jp等等) )。
答案 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电子邮件地址,她不再住在英国:-)这是你必须做出商业选择的地方,你可以:
您的业务,您的选择; - )
所以,有了这个序言,如果你必须这样做,你可以这样做:
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
)。