Как я могу извлечь адреса электронной почты между '<' и '>'? - PullRequest
2 голосов
/ 22 августа 2011

У меня есть список писем и имен из Outlook, разделенных точкой с запятой, например:

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

И я хотел бы извлечь письма и разделить их точкой с запятой следующим образом:

email1; email2; ... ; emailN

Как я могу сделать это в Python?

Ответы [ 3 ]

6 голосов
/ 22 августа 2011

Использование регулярного выражения:

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
2 голосов
/ 22 августа 2011

Использование списка:

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] соответствует выбору от второго символа до второгокого).

0 голосов
/ 22 августа 2011

вариаций на заданную тему:

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...