如何从“<”和“>”之间提取电子邮件地址?

3

我有一个从Outlook中获取的邮件和姓名列表,使用分号进行分隔,格式如下:

fname lname <email>; fname2 lname2 <email2>; ... ; fnameN lnameN <emailN>

我想提取电子邮件并使用分号将它们分隔开,就像这样:

email1; email2; ... ; emailN

我该如何在Python中实现这个功能?


最终,一个适合使用正则表达式的任务。 - Michael Lorton
3个回答

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

3
使用列表推导式:
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]对应于从第二个字符到倒数第二个字符的选择)。


很好,知道还有另一种思考这个问题的方式。谢谢。 - nfw

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接