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

33 投票
3 回答
132259 浏览
提问于 2025-04-17 08:44

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

我想找一个简单的方法来检查三个不同的字符串。

基本上,我在用一个 for 循环遍历一个文件,然后我需要检查这个文件的每一行是否包含我在列表中设置的三个字符串中的任意一个。

到目前为止,我找到的是多个条件的 if 检查,但我觉得这样写并不优雅,也不够高效:

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

我在想能不能创建一个包含 string1string2string3 的列表,然后检查这一行是否包含这些字符串中的任何一个,但我发现似乎不能直接比较这个列表,而不需要显式地遍历这个列表。在这种情况下,我的情况和上面写的多个 if 语句基本上是一样的。

有没有什么聪明的方法可以检查多个字符串,而不需要写冗长的 if 语句或遍历列表的元素呢?

3 个回答

4

一种方法是把搜索的字符串组合成一个正则表达式的模式,就像在这个回答中提到的那样。

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. 提醒我这一点。)不过我觉得在你的使用场景下,这种方法可能还是会有平方级的性能,因为你还是需要多次调用它来搜索多行内容。不过,它的效率会比上面提到的(平均立方级)算法要好。

78

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有些人可能在使用某些工具或库的时候,遇到了一些错误或者不明白的地方。这种情况下,大家通常会去像StackOverflow这样的论坛上寻求帮助。

在这些论坛上,其他程序员会分享他们的经验和解决方案,帮助你理解问题的根源,并提供一些可行的解决办法。通过这些讨论,你可以学到很多实用的技巧和知识,逐渐提高自己的编程能力。

总之,遇到问题时,不要害怕寻求帮助,社区的力量可以让你更快地找到解决方案,提升自己的技能。

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

撰写回答