【问题标题】:Find array item in a string在字符串中查找数组项
【发布时间】:2011-08-17 01:34:39
【问题描述】:

我知道可以使用string.find() 在字符串中查找子字符串。

但是在不使用循环的情况下找出其中一个数组项是否在字符串中匹配子字符串的最简单方法是什么?

伪代码:

string = 'I would like an apple.'
search = ['apple','orange', 'banana']
string.find(search) # == True

【问题讨论】:

    标签: python arrays string find match


    【解决方案1】:

    你可以使用生成器表达式(不知何故一个循环)

    any(x in string for x in search)
    

    生成器表达式是括号内的部分。它为元组search 中的每个x 创建一个返回x in string 的值的可迭代对象。 x in string 依次返回 string 是否包含子字符串 x。最后,Python 内置的 any() 迭代它传递的可迭代对象,并在其任何项的计算结果为 True 时返回。

    或者,您可以使用正则表达式来避免循环:

    import re
    re.search("|".join(search), string)
    

    我会选择第一个解决方案,因为正则表达式有陷阱(转义等)。

    【讨论】:

    • +1 用于生成器表达式。 -1 表示正则表达式。 +1 推荐反对正则表达式。嘘! +1!
    • @nmichaels:我包含正则表达式示例只是因为“无循环”要求。
    • @Sven:我想通了。我的舌头在那里非常牢靠。这是一个可靠的答案。
    • @Sven Marnach 切掉 search 中某些字符可能的符号含义,根据 re 的规则可以做到:re.search("|".join(re.escape(search)), string) 还有什么坑?
    • @eyquem:在这个特殊的例子中,转义可能是唯一的陷阱。
    【解决方案2】:

    Python 中的字符串是序列,您可以通过询问一个字符串是否存在于另一个字符串中来进行快速成员资格测试:

    >>> mystr = "I'd like an apple"
    >>> 'apple' in mystr
    True
    

    Sven 在上面的第一个答案中是正确的。要检查其他字符串中是否存在多个字符串中的任何一个,您可以:

    >>> ls = ['apple', 'orange']
    >>> any(x in mystr for x in ls)
    True
    

    值得注意的是,内置的“all()”函数只有在“ls”中的所有项都是“mystr”的成员时才会返回true:

    >>> ls = ['apple', 'orange']
    >>> all(x in mystr for x in ls)
    False
    >>> ls = ['apple', 'like']
    >>> all(x in mystr for x in ls)
    True
    

    【讨论】:

      【解决方案3】:

      比较简单的是

      import re
      regx = re.compile('[ ,;:!?.:]')
      
      string = 'I would like an apple.'
      search = ['apple','orange', 'banana']
      
      print any(x in regx.split(string) for x in search)
      

      编辑

      更正,在阅读了 Sven 的回答后:显然,string 必须不被拆分,愚蠢! any(x in string for x in search) 效果很好

      如果你不想循环:

      import re
      regx = re.compile('[ ,;:!?.:]')
      
      string = 'I would like an apple.'
      search = ['apple','orange', 'banana']
      print regx.split(string)
      
      print set(regx.split(string)) & set(search)
      

      结果

      set(['apple'])
      

      【讨论】:

        猜你喜欢
        • 2020-06-19
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 2017-03-22
        • 2015-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多