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

use*_*198 28 python

可能重复:
检查另一个字符串中是否存在多个字符串

我试图找出是否有一个很好的和干净的方式来测试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"
Run Code Online (Sandbox Code Playgroud)

我在想,如创建一个包含列表string1,string2string3,并检查是否这些被包含在该行,但它似乎并不认为我可以比较列表,而无需显式循环槽列表,在这种情况下,我基本上与我在上面写的多个if语句中的条件相同.

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

Nik*_* B. 72

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

  • 虽然[`any`](http://docs.python.org/library/functions.html?highlight=any#any)的含义非常符合逻辑,但我从未使用它,所以我不得不查阅它.好的代码@Niklas. (3认同)
  • 这是一个功能.所有`any`都检查序列中的任何值是否为true-ish.真正的魔力是使用序列的生成器表达式. (3认同)

sen*_*rle 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
Run Code Online (Sandbox Code Playgroud)

这也具有any短路的优点,因此一旦找到匹配就停止循环.而且,这只是找到一个字符串的第一次出现search_stringslinesX.如果要查找多个匹配项,可以执行以下操作:

>>> 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')]
Run Code Online (Sandbox Code Playgroud)

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