Лучший способ отфильтровать письма и домены в python - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть список адресов электронной почты и доменов, которые я пытаюсь отфильтровать как черный список

Для электронной почты это легко, поскольку я могу просто сравнивать электронные письма напрямую, но для доменов также должны совпадать электронные письма с поддоменами и т. Д.

поэтому для домена foo.com мне нужно отфильтровать

x@foo.com
x@subdomain.foo.com

Как это обычно делается? Через регулярное выражение? Разделить письмо на соответствующие строки?

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Я думаю, что самый простой способ сделать это - использовать строковый метод 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

Это явно больше работы. На данный момент я бы сказал, что этот метод по сравнению с регулярным выражением является вопросом предпочтения. Хотя я и стараюсь избегать регулярных выражений любой ценой, это может быть подходом для вас.

1 голос
/ 10 ноября 2011

Это был бы самый простой способ, о котором я могу подумать:

>>> f = 'foo@subdomain.bar.com'
>>> '.'.join(f.split('.')[-2:])
'bar.com'

Он не использует регулярное выражение, это только одна строка, очень читаемая, он вытянет имя домена и имеетдобавленное преимущество отсутствия заботы о том, является ли домен доменом .com, .net или чем-либо другим.

Тогда вы просто проверите извлеченный домен по таблице в черном списке.

РЕДАКТИРОВАТЬ: Хорошо, для.co.uk domains et al

>>> import re
>>> def get_addr(email_addr):
        parts = re.split(r'[\@\.]', email_addr)
        return '.'.join(parts[(-3 if parts[-2] == 'co' else -2):])
>>> get_addr('foo@subdomain.bar.com')
'bar.com'
>>> get_addr('foo@subdomain.bar.co.uk')
'bar.co.uk'
>>> get_addr('foo@bar.com')
'bar.com'

EDIT: @Wilduck указывал, что могут быть случаи, когда вы хотите отфильтровать определенные субдоамины, но не другие (например, community.ebay.co.uk«).Я подумал, что вы также можете занести в черный список определенные адреса электронной почты, не нуждаясь в отдельной таблице (например, exgirlfriend@gmail.com).Вот мое решение:

>>> def is_in_blacklist(addr):
...     #check if addr is in your list or db table
...     return True or False

>>> def addr_is_blacklisted(addr):
...     if not addr: return False
...     if is_in_blacklist(addr):
...         return True
...     sliced = '.'.join(addr.split('@' if '@' in addr else '.')[1:])
...     return addr_is_blacklisted(sliced)

Итак, он разбирает адрес электронной почты от начала до конца и проверяет каждую часть на предмет вашего черного списка.Очевидно, что вы не можете получить ответ с помощью одного запроса, но вы можете фильтровать по отдельным адресам электронной почты, поддоменам, доменам и вплоть до доменов верхнего уровня, если вы так склонны.В среднем у вас будет 3-4 запроса на одно письмо, и вы не убьете себя, если у вас огромный черный список.

0 голосов
/ 10 ноября 2011

как насчет

.*foo\.com$

это работает?

...