检查另一个字符串中是否存在多个字符串

jah*_*max 338 python arrays string exists

如何检查数组中的任何字符串是否存在于另一个字符串中?

喜欢:

a = ['a', 'b', 'c']
str = "a123"
if a in str:
  print "some of the strings found in str"
else:
  print "no strings found in str"
Run Code Online (Sandbox Code Playgroud)

该代码不起作用,只是为了展示我想要实现的目标.

Mar*_*ers 636

你可以使用any:

if any(x in str for x in a):
Run Code Online (Sandbox Code Playgroud)

类似于检查是否找到列表中的所有字符串,请使用all而不是any.

  • any()采用可迭代的.我不确定你使用的是哪个版本的Python,但在2.6中你需要将[]围绕你的参数放到任何().any([x in a中的x为x]),以便理解返回一个可迭代的.但也许后来的Python版本已经这样做了. (11认同)
  • @Mark Byers:对于迟到的评论感到抱歉,但有没有办法打印找到的字符串?你会怎么做 谢谢. (6认同)
  • @emispowder它在我的Python 2.6.9中可以正常使用. (6认同)
  • 不确定我理解,如果a是列表,str是要匹配的东西,x是什么?Python新手ftw.:) (3认同)
  • @red:你可以在'列表中的每个元素'中读取`for x'.由于`a`是字符串列表,而`x`是该列表的元素,`x`是一个字符串(原始示例中的'a','b','c'之一) (2认同)
  • @emispowder:[生成器表达式](https://www.python.org/dev/peps/pep-0289/)在2.4中引入. (2认同)
  • 基本上 [x in str for x in a] 根据是否找到字符串返回 True/False 列表。any() 函数迭代 True/False 列表,如果列表中有一个 True,则返回 True。@CodeGuru (2认同)

zon*_*ndo 57

any()如果你想要的只是True或者False,那么到目前为止是最好的方法,但是如果你想知道哪些字符串/字符串匹配,你可以使用一些东西.

如果您想要第一个匹配(False默认情况下):

match = next((x for x in a if x in str), False)
Run Code Online (Sandbox Code Playgroud)

如果你想得到所有的比赛(包括重复):

matches = [x for x in a if x in str]
Run Code Online (Sandbox Code Playgroud)

如果您想获得所有非重复匹配(忽略订单):

matches = {x for x in a if x in str}
Run Code Online (Sandbox Code Playgroud)

如果您想以正确的顺序获得所有非重复匹配:

matches = []
for x in a:
    if x in str and x not in matches:
        matches.append(x)
Run Code Online (Sandbox Code Playgroud)


jbe*_*das 41

如果字符串在astr变长,你应该小心.直接的解决方案采用O(S*(A ^ 2)),其中S长度为strA,A是所有字符串长度的总和a.要获得更快的解决方案,请查看用于字符串匹配的Aho-Corasick算法,该算法以线性时间O(S + A)运行.

  • 一些 python Aho-Corasick 库位于[此处](https://pypi.python.org/pypi/pyahocorasick/) 和[此处](https://github.com/JanFan/py-aho-corasick) (3认同)

jet*_*com 19

只是为了增加一些多样性regex:

import re

if any(re.findall(r'a|b|c', str, re.IGNORECASE)):
    print 'possible matches thanks to regex'
else:
    print 'no matches'
Run Code Online (Sandbox Code Playgroud)

或者如果你的名单太长 - any(re.findall(r'|'.join(a), str, re.IGNORECASE))

  • 时间复杂度是多少? (3认同)
  • 您可以根据需要使用''|'.join(map(re.escape,strings_to_match))`对其进行转义。您可能也有`re.compile('|'.join(...))`。 (2认同)

Ber*_*pac 11

一个令人惊讶的快速方法是使用set

a = ['a', 'b', 'c']
str = "a123"
if set(a) & set(str):
    print("some of the strings found in str")
else:
    print("no strings found in str")
Run Code Online (Sandbox Code Playgroud)

这适用于如果a不包含任何多字符的值(在这种情况下,使用any所列出以上)。如果是这样,指定a为字符串更简单:a = 'abc'


Sea*_*ell 8

你需要迭代a的元素.

a = ['a', 'b', 'c']
str = "a123"
found_a_string = False
for item in a:    
    if item in str:
        found_a_string = True

if found_a_string:
    print "found a match"
else:
    print "no match found"
Run Code Online (Sandbox Code Playgroud)

  • 只有你了解马克的代码.您遇到的问题是您没有检查数组的元素.有许多简洁,pythonic的方法来实现你想要的东西,这将隐藏你的代码错误的本质. (9认同)
  • 它可能是'可怕的代码',但它[正是任何()所做的](http://docs.python.org/2/library/functions.html#any).此外,这为您提供了匹配的实际字符串,而any()只是告诉您匹配. (8认同)
  • 是的,我知道该怎么做,但与马克斯的答案相比,这是可怕的代码. (2认同)