【问题标题】:How to search string members of a list in another string in Python 2如何在 Python 2 中的另一个字符串中搜索列表的字符串成员
【发布时间】:2012-03-14 23:36:31
【问题描述】:

我有一个字符串,假设是一封来自字段的电子邮件:

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 在列表中,无论电子邮件地址周围没有''...

【问题讨论】:

    标签: python search


    【解决方案1】:

    来自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([])
    

    【讨论】:

    • 好吧,在您的版本之前,我认为这就是我需要的...我的意思是,没有 '' % l,但只有 l ...正如您所注意到的,“名称emailaddress@example.com" 不匹配,我需要。但为什么这是“verylongemail2@yahoo.com”的问题?
    • “verylongemail2@yahoo.com”包含“email2@yahoo.com”,但它们是不同的地址,不应匹配。
    • 等等,我编辑了我的帖子,似乎我没有更好地解释它。在我的情况下,电子邮件地址周围的“”应该不是必需的......
    • 这个版本怎么样?请记住,使用正则表达式完美匹配的电子邮件地址可能会变得非常复杂。
    • 确实是“极其复杂”。例如,请参阅ex-parrot.com/~pdw/Mail-RFC822-Address.html,并注意规范允许必须预处理的内容,否则根本无法通过适当的正则表达式进行解析。
    【解决方案2】:

    通常正则表达式不被认为是 Python 的,但这似乎是为他们量身定做的任务。

    所以我会使用它们,提取电子邮件地址并检查它是否是 in 列表:

    >>> re.search(r'<(.*)>', "Name <emailaddress@example.com>").group(1) in lst
    True
    

    “pythonic”不是一个可以解决任何问题的词,应该考虑所有可用的选项并选择最好的一个。

    编辑:如果您的字段格式不标准,没问题:您只需要一个更好的正则表达式来匹配电子邮件。 (我敢肯定那里有很多例子,我不会为你搜索它)。

    但这并不意味着您不应该将正则表达式用于此类任务。

    【讨论】:

    • @JavierNovoaC.:电子邮件地址是否没有被&lt;&gt; 包围并不重要,我只是向您展示一个带有基本正则表达式的简单示例。您可以使用不同的正则表达式来提取电子邮件地址。我真的没有看到问题。
    • 谢谢,我去找找。我正在寻找一个 pythonic 解决方案,考虑我的问题的背景,但你提到的那件事是一个很好的建议......
    【解决方案3】:

    我不知道这是不是pythonic:

    return str1.split('<')[1].split('>')[0] in lst
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 2019-06-26
      • 2020-03-12
      • 1970-01-01
      • 2021-11-28
      • 2013-01-18
      相关资源
      最近更新 更多