我有一个来自Outlook的分组电子邮件和名称,分号分隔,如下所示:
fname lname <email>; fname2 lname2 <email2>; ... ; fnameN lnameN <emailN>
我想提取电子邮件和分号分隔它们:
email1; email2; ... ; emailN
我怎样才能在Python中执行此操作?
答案 0 :(得分:6)
import re
# matches everything which is between < and > (excluding them)
ptrn = re.compile("<([^>]+)>")
# findall returns ['email','email2']. Join concats them.
print '; '.join(ptrn.findall("fname lname <email>; fname2 lname2 <email2>;"))
# email; email2
答案 1 :(得分:2)
使用列表理解:
em = "fname lname <email>; fname2 lname2 <email2>; fnameN lnameN <emailN>"
email_list = [entry.split()[-1][1:-1] for entry in em.split(';')]
# email_list:
# ['email', 'email2', 'emailN']
<强>击穿强>:
for entry in em.split(';')
首先,它用分号分割原始字符串。
entry.split()
接下来,它将每个条目再次分割,这次是按空格分割。
entry.split()[-1]
接下来,它会从拆分中选择最后一个条目,即您的电子邮件。
entry.split()[-1][1:-1]
这会收到您的电子邮件,其形式为“<email@addr.com>
”并选择尖括号中包含的字符串([1:-1]对应于从第二个字符中选择倒数第二个)。
答案 2 :(得分:0)
给定主题的变体:
s = 'fname lname <email>; fname2 lname2 <email2>; ... ; fnameN lnameN <emailN>'
print [ s[i+1 : i+s[i:].find('>')] for i,c in enumerate(s) if c == '<' ]
# OR
gen = ( i for i,c in enumerate(s) if c in '<>' )
print [ s[a+1:gen.next()] for a in gen]