Способ разбора текста Cc поле заголовка письма? - PullRequest
5 голосов
/ 25 марта 2011

У меня есть простой текст поля заголовка Cc, который выглядит так:

friend@email.com, John Smith <john.smith@email.com>,"Smith, Jane" <jane.smith@uconn.edu>

Существуют ли какие-либо проверенные в бою модули для правильного синтаксического анализа?

(бонус, если он в python! Модуль электронной почты просто возвращает необработанный текст без каких-либо методов его разбиения, AFAIK) (также бонус, если он разделяет имя и адрес на поля)

Ответы [ 4 ]

17 голосов
/ 25 марта 2011

Существует множество функций, доступных в качестве стандартного модуля Python, но я думаю, что вы ищете email.utils.parseaddr () или email.utils.getaddresses ()

>>> addresses = 'friend@email.com, John Smith <john.smith@email.com>,"Smith, Jane" <jane.smith@uconn.edu>'
>>> email.utils.getaddresses([addresses])
[('', 'friend@email.com'), ('John Smith', 'john.smith@email.com'), ('Smith, Jane', 'jane.smith@uconn.edu')]
0 голосов
/ 21 июля 2015

Преобразование нескольких строк электронной почты в словарь (несколько сообщений электронной почты с именем в одну строку).

emailstring = 'Friends <friend@email.com>, John Smith <john.smith@email.com>,"Smith" <jane.smith@uconn.edu>'

Разделить строку запятой

email_list = emailstring.split(',')

имя является ключом, а электронная почта является значением и составляет словарь.

email_dict = dict(map(lambda x: email.utils.parseaddr(x), email_list))

Результат такой:

{'John Smith': 'john.smith@email.com', 'Friends': 'friend@email.com', 'Smith': 'jane.smith@uconn.edu'}

Примечание:

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

'Friends <friend@email.com>, John Smith <john.smith@email.com>,"Smith" <jane.smith@uconn.edu>, Friends <friend_co@email.com>'

"Друзья" дублируются 2 раза.

0 голосов
/ 25 марта 2011

Сильфон совершенно не нужен.Я написал это до того, как понял, что вы можете передать getaddresses() список, содержащий одну строку, содержащую несколько адресов.

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

from email.utils import getaddresses

addrstring = ',friend@email.com, John Smith <john.smith@email.com>,"Smith, Jane" <jane.smith@uconn.edu>,'

def addrparser(addrstring):
    addrlist = ['']
    quoted = False

    # ignore comma at beginning or end
    addrstring = addrstring.strip(',')

    for char in addrstring:
        if char == '"':
            # toggle quoted mode
            quoted = not quoted
            addrlist[-1] += char
        # a comma outside of quotes means a new address
        elif char == ',' and not quoted:
            addrlist.append('')
        # anything else is the next letter of the current address
        else:
            addrlist[-1] += char

    return getaddresses(addrlist)

print addrparser(addrstring)

Дает:

[('', 'friend@email.com'), ('John Smith', 'john.smith@email.com'),
 ('Smith, Jane', 'jane.smith@uconn.edu')]

Мне было бы интересно посмотреть, как другие люди решат эту проблему!

0 голосов
/ 25 марта 2011

Я не использовал его сам, но мне кажется, что вы можете использовать пакет csv довольно просто для анализа данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...