2017-10-16 26 views
1

email.utils.parseaddr()을 사용하여 이메일 주소를 구문 분석하는 방법을 알고 있습니다. 그러나, 나는 그런이 헤더의 주소 부분 등 여러 개의 이메일 주소의 목록을 구문 분석 할 :python3/email : 쉼표가 포함 된 이메일 주소 목록을 파싱 하시겠습니까?

일반적으로
Cc: "abc" <[email protected]>, "www, xxyyzz" <[email protected]> 

, 나는 내가 개별 주소를 얻을 수 \s*,\s* 같은 정규식에 분할 할 수 있습니다 알고있다, 그러나에 예를 들어, 주소 중 하나의 이름 부분에 쉼표가 포함되어 있으므로이 정규 표현식은 헤더를 잘못 분리합니다.

필자는 상태 머신 기반 코드를 수동으로 작성하여 해당 주소를 여러 조각으로 나누는 방법을 알고 있으며 각 전자 메일 주소와 일치하는 복잡한 정규식을 코딩하는 방법도 알고 있습니다. 나는 그러한 코드를 작성하는 데 도움을 요청하지 않습니다. 오히려, 나는이 전자 메일 주소 목록을 적절하게 분리 할 수있는 기존의 파이썬 모듈이 있는지 궁금하여, "바퀴를 다시 발명 할 필요가 없습니다".

미리 감사드립니다.

+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

파이썬 (버전 3.6.0)의 제 버전에서, 'email.utils.parseaddr (' "abc"<[email protected]> "www, xxyyzz"<[email protected]>')'('abc', '[email protected]')의 첫 번째 튜플 만 반환합니다. '... 그리고 파이썬 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]')]