我有一个Cc标题字段的纯文本,如下所示:
friend@email.com, John Smith <john.smith@email.com>,"Smith, Jane" <jane.smith@uconn.edu>
是否有任何经过测试的模块可以正确解析?
(奖金,如果它在python中!电子邮件模块只返回原始文本,没有任何分割方法,AFAIK) (如果将名称和地址拆分为字段,也会获得奖励)
答案 0 :(得分:17)
有许多功能可用作标准的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')]
答案 1 :(得分:0)
我自己没有使用它,但在我看来,你可以很容易地使用csv包来解析数据。
答案 2 :(得分:0)
波纹管是完全没必要的。我在认识到你可以传递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')]
我有兴趣看看其他人会如何解决这个问题!
答案 3 :(得分:0)
将多个电子邮件字符串转换为字典(多个电子邮件,其名称为一个字符串)。
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'}
注意:
如果有相同的名称和不同的电子邮件ID,则会跳过一条记录。
'Friends <friend@email.com>, John Smith <john.smith@email.com>,"Smith" <jane.smith@uconn.edu>, Friends <friend_co@email.com>'
&#34;朋友&#34;重复2次。