我有一个字符串,让我们说一封电子邮件来自字段:
str1 = "Name <emailaddress@example.com>"
(或者可能使用其他格式,就是在str内部找到一个电子邮件地址......)
我有一份地址清单:
lst = ["email1@example.com", "email2@yahoo.com", "email3@mail.com", "emailaddress@example.com"]
如果带有电子邮件地址的str部分是lst上的成员之一,那么搜索最pythonic的方法是什么?
在示例中,str1的电子邮件部分是lst的一部分,但是用于:
str2 = "Another email emailexample@domain.com"
不是......
此外,
str3 = "Example email1@example.com"
匹配,因为email1 @example.com在列表中,无论是否有'&lt;' '&GT;'围绕电子邮件地址......
答案 0 :(得分:2)
来自http://love-python.blogspot.com/2008/04/python-code-to-scrape-email-address.html
>>> email_pattern = re.compile("[-a-zA-Z0-9._]+@[-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+")
>>> str = "Name <emailaddress@example.com>"
>>> str2 = "Another email emailexample@domain.com"
>>> lst = ["email1@example.com", "email2@yahoo.com", "email3@mail.com", "emailaddress@example.com"]
>>> import re
>>> set(re.findall(email_pattern, str)).intersection(lst)
set(['emailaddress@example.com'])
>>> set(re.findall(email_pattern, str2)).intersection(lst)
set([])
答案 1 :(得分:2)
通常正则表达式不被认为是pythonic,但这似乎是完全适合他们的任务。
所以我会使用它们,提取电子邮件地址并检查它是否是in
列表:
>>> re.search(r'<(.*)>', "Name <emailaddress@example.com>").group(1) in lst
True
“pythonic”不是一个可以解决任何问题的词,应该考虑所有可用的选项并选择最好的选项。
编辑:如果您的字段格式不标准,没问题:您只需要一个与电子邮件匹配的更好的正则表达式。 (我确信那里有很多例子,我不打算为你辩护。)
但这并不意味着你不应该使用正则表达式来完成这类任务。
答案 2 :(得分:1)
我不知道这是否是pythonic:
return str1.split('<')[1].split('>')[0] in lst