如何提取尖括号中的邮箱地址?

3 投票
3 回答
1652 浏览
提问于 2025-04-17 00:07

我有一个从Outlook导出的电子邮件和姓名的列表,使用分号分隔,格式像这样:

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

我想把这些电子邮件提取出来,并用分号重新分隔,像这样:

email1; email2; ... ; emailN

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

3 个回答

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]
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]表示从第二个字符到倒数第二个字符)。

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

撰写回答