如何在Python 2中搜索另一个字符串中列表的字符串成员

时间:2012-03-14 23:36:32

标签: python search

我有一个字符串,让我们说一封电子邮件来自字段:

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;'围绕电子邮件地址......

3 个答案:

答案 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