Я думаю, что самый простой способ сделать это - использовать строковый метод ends_with
. Этот метод работает следующим образом:
>>> blacklisted = 'foo.com'
>>> email = 'x@foo.com'
>>> email.endswith('foo.com')
True
>>> email = 'x@subdomain.foo.com'
>>> email.endswith('foo.com')
True
Таким образом, это вернет true, если домен, или электронная почта, или что-то еще заканчивается на 'foo.com'
. Как вы можете видеть, это будет включать все субдомены 'foo.com'
. Для удобства вы также можете передать кортеж в endswith
, поэтому, если вы создаете кортеж из ваших доменов, занесенных в черный список, вы можете сделать что-то вроде этого:
>>> blacklisted = ('foo.com', 'bar.com')
>>> email = 'x@bar.com'
>>> email.endswith(blacklisted)
True
Это даже даст возможность занести в черный список некоторые субдомены, но не другие.
>>> 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
Редактировать: В ответ на комментарий Авариса:
Чтобы убедиться, что вы не попали в такую ситуацию:
>>> blacklisted = ('bar.com', 'baz.com')
>>> email = 'x@foobar.com'
>>> email.endswith(blacklisted)
True
Вы можете включить в свой черный список как '.bar.com'
, так и '@bar.com'
. Результат которого
>>> blacklisted = ('.bar.com', '@bar.com', '.baz.com', '@baz.com')
>>> email = 'x@foobar.com'
>>> email.endswith(blacklisted)
False
Это явно больше работы. На данный момент я бы сказал, что этот метод по сравнению с регулярным выражением является вопросом предпочтения. Хотя я и стараюсь избегать регулярных выражений любой ценой, это может быть подходом для вас.