我希望能够解析电子邮件地址以隔离域部分,并测试电子邮件地址是否属于给定域。
据我所知,email
模块没有这样做。除了通常的字符串处理和正则表达式例程之外,还有什么值得使用的吗?
注意:我知道如何处理python字符串。我不需要基本食谱,但欢迎使用很棒的食谱。
这里的问题主要是电子邮件地址的格式(示意图)userpart@sub\.domain\.[sld]+\.tld
。
在@之前剥离部件很容易;困难的部分是解析域以确定哪个部分是更大组织的域上的子域,而不是通用的二级(或者,我猜甚至更高阶)公共域。
想象一下,解析user@mail.organisation.co.uk
以发现该组织的域名为organisation.co.uk
,因此能够将mail.organisation.co.uk
和finance.organisation.co.uk
作为organisation.co.uk
的子域进行匹配。
基本上有两种可能的(基于非dns的)方法:构建一个有限的自动机,它知道所有通用的sld及其与tld的关系(包括流行的'假'sld,如uk.com
),或尝试猜测,基于必须有tld的知识,并假设如果有三个(或更多)元素,如果第二级域少于三个/四个字符,则它是通用的。每种方法的相对缺点应该是显而易见的。
另一种方法是查看DNS条目以确定哪些是注册域,这有其自身的缺点。
无论如何,我宁愿背驮别人的工作。
答案 0 :(得分:1)
根据@ dm03514的评论,有一个python库正是这样做的:tldextract:
>>> import tldextract
>>> tldextract.extract('foo@bar.baz.org.uk')
ExtractResult(subdomain='bar', domain='baz', tld='org.uk')
答案 1 :(得分:0)
使用这个简单的脚本,我们将@
替换为@.
,以便我们的域名终止,endswith
与以相同文字结尾的域名不匹配。
def address_in_domain(address, domain):
return address.replace('@', '@.').endswith('.' + domain)
if __name__ == '__main__':
addresses = [
'user1@domain.com',
'user1@anotherdomain.com',
'user2@org.domain.com',
]
print filter(lambda address: address_in_domain(address, 'domain.com'), addresses)
# Prints: ['user1@domain.com', 'user2@org.domain.com']