如何检查一行是否有列表中的一个字符串?

时间:2011-12-21 00:09:42

标签: python

  

可能重复:
  Check if multiple strings exist in another string

我试图找出是否有一种不错的方法来测试3种不同的字符串。

基本上我使用for循环来循环文件;然后我必须检查它是否包含我在列表中设置的3个字符串中的1个。

到目前为止,我已经找到了多个if条件检查,但它感觉不是真的优雅和高效:

for line in file
    if "string1" in line or "string2" in line or "string3" in line:
        print "found the string"

我在考虑创建一个包含string1string2string3的列表,并检查这些行中是否包含其中任何一个,但似乎不是我可以只是比较列表而不通过列表显式循环,在这种情况下,我基本上处于与上面写的多个if语句相同的条件。

是否有任何智能方法可以检查多个字符串而无需编写long if语句或循环使用列表元素?

3 个答案:

答案 0 :(得分:67)

strings = ("string1", "string2", "string3")
for line in file:
    if any(s in line for s in strings):
        print "yay!"

答案 1 :(得分:14)

这仍然会循环通过两个列表中的笛卡尔积,但它只有一行:

>>> lines1 = ['soup', 'butter', 'venison']
>>> lines2 = ['prune', 'rye', 'turkey']
>>> search_strings = ['a', 'b', 'c']
>>> any(s in l for l in lines1 for s in search_strings)
True
>>> any(s in l for l in lines2 for s in search_strings)
False

这也有any短路的优点,因此一旦找到匹配,循环就会停止。此外,这只会在search_strings中找到linesX中第一次出现的字符串。如果您想要找到多个匹配项,可以执行以下操作:

>>> lines3 = ['corn', 'butter', 'apples']
>>> [(s, l) for l in lines3 for s in search_strings if s in l]
[('c', 'corn'), ('b', 'butter'), ('a', 'apples')]

如果您想编写更复杂的代码,Aho-Corasick算法似乎可以测试给定输入字符串中是否存在多个子字符串。 (感谢Niklas B.指出这一点。)我仍然认为它会导致你的用例的二次性能,因为你仍然需要多次调用它来搜索多行。但是,它会超过上述(立方,平均)算法。

答案 2 :(得分:4)

一种方法是将搜索字符串组合成正则表达式模式,如this answer