我试图找出是否有一种不错的方法来测试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"
我在考虑创建一个包含string1
,string2
和string3
的列表,并检查这些行中是否包含其中任何一个,但似乎不是我可以只是比较列表而不通过列表显式循环,在这种情况下,我基本上处于与上面写的多个if语句相同的条件。
是否有任何智能方法可以检查多个字符串而无需编写long if语句或循环使用列表元素?
答案 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。