在python中过滤掉电子邮件和域的最佳方法

sas*_*ker 3 python regex email filtering email-validation

我有一个电子邮件和域列表,我试图将其作为黑名单过滤掉

对于电子邮件,这很容易,因为我可以直接比较电子邮件,但对于域,还需要匹配带有子域等的电子邮件。

所以对于 foo.com 域,我需要过滤掉

x@foo.com
x@subdomain.foo.com
Run Code Online (Sandbox Code Playgroud)

这通常是如何完成的?通过正则表达式?将电子邮件拆分为适当的字符串?

Wil*_*uck 5

我认为最简单的方法是使用string 方法ends_with。该方法的工作原理如下:

>>> blacklisted = 'foo.com'
>>> email = 'x@foo.com'
>>> email.endswith('foo.com')
True
>>> email = 'x@subdomain.foo.com'
>>> email.endswith('foo.com')
True
Run Code Online (Sandbox Code Playgroud)

因此,如果域、电子邮件或任何以'foo.com'. 如您所见,这将包括'foo.com'. 方便地,您还可以将元组传递给endswith,因此如果您构建一个列入黑名单的域的元组,您可以执行以下操作:

>>> blacklisted = ('foo.com', 'bar.com')
>>> email = 'x@bar.com'
>>> email.endswith(blacklisted)
True
Run Code Online (Sandbox Code Playgroud)

这甚至可以将某些子域列入黑名单,而不能将其他子域列入黑名单。

>>> blacklisted = ('foo.com', 'bar.com', 'sub.baz.net')
>>> email_bad = 'x@sub.baz.net'
>>> email_bad.endswith(blacklisted)
True
>>> email_good = 'x@good.baz.net'
>>> email_good.endswith(blacklisted)
False
Run Code Online (Sandbox Code Playgroud)

编辑:回应阿瓦里斯的评论:

为了确保您不会遇到这种情况:

>>> blacklisted = ('bar.com', 'baz.com')
>>> email = 'x@foobar.com'
>>> email.endswith(blacklisted)
True
Run Code Online (Sandbox Code Playgroud)

您可以将'.bar.com'和都包括在黑名单中'@bar.com'。结果是

>>> blacklisted = ('.bar.com', '@bar.com', '.baz.com', '@baz.com')
>>> email = 'x@foobar.com'
>>> email.endswith(blacklisted)
False
Run Code Online (Sandbox Code Playgroud)

这显然是更多的工作。在这一点上,我会说这种方法与正则表达式是一个偏好问题。虽然我会不惜一切代价避免使用正则表达式,但它可能是您的最佳选择。