2017-10-16 99 views
1

我知道如何使用email.utils.parseaddr()来解析电子邮件地址。不过,我想分析多个电子邮件地址,比如这个标题的地址部分的列表:python3/email:使用嵌入式逗号解析电子邮件地址列表?

Cc: "abc" <[email protected]>, "www, xxyyzz" <[email protected]> 

在一般情况下,我知道我可以像\s*,\s*一个正则表达式来获取个人地址分裂,但在我的例子中,其中一个地址的名称部分包含一个逗号,因此这个正则表达式会错误地分割头部。

我知道如何手动编写基于状态机的代码来将该地址分割成几部分,并且我也知道如何对与每个电子邮件地址匹配的复杂正则表达式进行编码。我不是在写这样的代码时寻求帮助。相反,我想知道是否有任何现有的python模块可以用来正确拆分这个电子邮件地址列表,所以我不必“重新发明轮子”。

预先感谢您。

+0

[email.utils.parseaddr](https:// doc s.python.org/3.6/library/email.util.html#email.utils.parseaddr)没有做到这一点?似乎与你有的例子一起工作:https://repl.it/Mi08 - 返回(name,email_addr)的元组,而不用第二个名字中的逗号分割 – davedwards

+0

在我的python版本(版本3.6.0)中, 'email.utils.parseaddr(''abc'<[email protected]>,“www,xxyyzz”<[email protected]>')'只返回第一个元组,即'('abc','[email protected]') '...当我在python 2.7.9 – HippoMan

+0

下尝试这个时,情况也是如此......我明白了。在你的例子中,在每个元素上调用'email.utils.parseaddr'之前,你已经手动将头部分割成2个元素的列表。 – HippoMan

回答

4

从这个问题How do you extract multiple email addresses from an RFC 2822 mail header in python?

msg = 'Cc: "abc" <[email protected]>, "www, xxyyzz" <[email protected]>' 

import email.utils 

print(email.utils.getaddresses([msg])) 

借款答案产生:

[('abc', '[email protected]'), ('www, xxyyzz', '[email protected]')] 
+0

只需'email.utils.getaddresses([msg])''就可以了这里 –

+0

确实你是对的,谢谢@JonClements – davedwards

+0

是的,这是我正在寻找的答案。非常感谢! – HippoMan

0

这不是最优雅的,我敢肯定有人会出现并改善这一点。然而,这对我来说很有用,并且希望能给你一个如何做到这一点的想法。

拆分方法就是你在这里寻找的,我相信。用最简单的术语,你把你的字符串,并选择一个字符split。这将把字符串分隔成一个列表,您可以在发现分割键选择的情况下进行迭代。如果没有找到,那么字符串是一个元素列表。

emails = 'Cc: "abc" <[email protected]>, "www, xxyyzz" <[email protected]>' 
emails 
Out[37]: 
'Cc: "abc" <[email protected]>, "www, xxyyzz" <[email protected]>' 
In [38]: 
emails = emails.split(' ') 
new_emails = [] 
for e in emails: 
    if '@' in e: 
     new_email = e.replace('<', '') 
     new_email = new_email.replace('>', '') 
     new_email = new_email.replace(',', '') 
     new_emails.append(new_email) 
print(new_emails) 
['[email protected]', '[email protected]'] 

如果你想使用正则表达式来做到这一点,有人比我聪明的将不得不帮助。

+0

工作是的,谢谢。我知道如何通过split来做到这一点,但我只是希望找到一个能够在一般情况下执行此操作的现有软件包。另外,我还想获取地址的名称部分,以便得出如下结果:'[''abc“<[email protected]>','”www,xxyyzz“<[email protected]>']'。我知道如何编写代码,但是,我希望现有的包可以用来做到这一点,如果这样的事情已经存在。 – HippoMan

0

我知道我可以做类似下面的,但同样,我希望是已经存在的现有包可以做到这一点...

#!/usr/bin/python3   

import email.utils 

def getaddrs(text): 
    def _yieldaddrs(text): 
     inquote = False 
     curaddr = '' 
     for x in text: 
      if x == '"': 
       inquote = not inquote 
       curaddr += x 
      elif x == ',': 
       if inquote: 
        curaddr += x 
       else: 
        yield(curaddr) 
        curaddr = '' 
      else: 
       curaddr += x 
     if curaddr: 
      yield(curaddr) 
    return [email.utils.parseaddr(x) for x in _yieldaddrs(text)] 

addrstring = '"abc" <[email protected]>, "www, xxyyzz" <[email protected]>' 
print('{}'.format(getaddrs(addrstring))) 
# Prints this ... 
# [('abc', '[email protected]'), ('www, xxyyzz', '[email protected]')] 
相关问题