2012-02-28 2 views
2

Я пытаюсь разобрать список адресов электронной почты, чтобы удалить имя пользователя и символ «@», оставив только имя домена.Как уловить «разделенные» исключения в python?

Пример: [email protected] Желаемый результат: gmail.com

Исполнив это с помощью следующего кода:

for row in cr: 
    emailaddy = row[0] 
    (emailuser, domain) = row[0].split('@') 
    print domain 

, но мой вопрос, когда я сталкиваюсь с неправильно форматированный адрес электронной почты , Например, если строка содержит «AAAAAAAAA» (вместо действительного адреса электронной почты) программа падает с ошибкой

(emailuser, domain) = row[0].split('@') 
ValueError: need more than 1 value to unpack. 

(как и следовало ожидать), а не проверять все адреса электронной почты для их действий, я бы скорее просто не обновляйте захват домена и переходите к следующей записи. Как я могу правильно обработать эту ошибку и просто перейти?

Так что для списка:

[email protected] 
[email protected] 
youououou 
[email protected] 

Я хотел бы выход быть:

gmail.com 
hotmail.com 

yahoo.com 

Спасибо!

+0

http://docs.python.org/tutorial/errors.html –

+1

Просто отметим, что единственный безопасный способ проверки подлинности электронной почты - отправить электронное письмо по адресу, чтобы владелец учетной записи удостоверился, что у них есть получил. –

+0

Обратите внимание, что некоторые @ отлично справляются по спецификации электронной почты. Так что гораздо разумнее делать 'rfind (" @ ")' или что-то .. – Voo

ответ

8

Вы хотите что-то вроде этого?

try: 
    (emailuser, domain) = row[0].split('@') 
except ValueError: 
    continue 
+0

omg facepalm. Спасибо :) –

3

Вы можете просто отфильтровать адрес, который не содержит @.

>>> [mail.split('@')[1] for mail in mylist if '@' in mail] 
['gmail.com', 'hotmail.com', 'yahoo.com'] 
>>> 
3

насчет

splitaddr = row[0].split('@') 
if len(splitaddr) == 2: 
    domain = splitaddr[1] 
else: 
    domain = '' 

Это даже обрабатывает случаи, как [email protected]@ccc и делает его недействительным ('').

+0

+1 для обработки 'aaa @ bbb @ ccc'. – RanRag

+1

Слишком много значений также приведет к 'ValueError'. –

2

Это делает то, что вы хотите:

import re 

l=["[email protected]","[email protected]", 
    "youououou","[email protected]","[email protected]@youso.com"] 

for e in l: 
    if '@' in e: 
     l2=e.split('@') 
     print l2[-1] 
    else: 
     print 

Выход:

gmail.com 
hotmail.com 

yahoo.com 
youso.com 

Он обрабатывает случай, когда электронная почта может иметь более одного символа '@' и просто берет RH этого.