可能重复:
检查另一个字符串中是否存在多个字符串
我试图找出是否有一个很好的和干净的方式来测试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,string2和string3,并检查是否这些被包含在该行,但它似乎并不认为我可以比较列表,而无需显式循环槽列表,在这种情况下,我基本上与我在上面写的多个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)
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_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')]
Run Code Online (Sandbox Code Playgroud)
如果您想编写更复杂的代码,Aho-Corasick算法似乎可以测试给定输入字符串中是否存在多个子字符串.(感谢Niklas B.指出这一点.)我仍然认为它会导致用例的二次性能,因为你仍然需要多次调用它来搜索多行.但是,它会超过上述(立方,平均)算法.