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

时间:2010-08-02 16:10:20

标签: 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"

该代码不起作用,只是为了表明我想要实现的目标。

14 个答案:

答案 0 :(得分:577)

您可以使用any

if any(x in str for x in a):

与检查列表中的字符串 all 类似,使用all代替any

答案 1 :(得分:51)

any()是迄今为止最好的方法,如果你想要的只是TrueFalse,但如果你想知道哪些字符串/字符串匹配,你可以使用几件事

如果您想要第一场比赛(默认为False):

match = next((x for x in a if x in str), False)

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

matches = [x for x in a if x in str]

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

matches = {x for x in a if x in str}

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

matches = []
for x in a:
    if x in str and x not in matches:
        matches.append(x)

答案 2 :(得分:38)

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

答案 3 :(得分:15)

只需添加 regex 的多样性:

import re

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

或者如果您的列表太长 - any(re.findall(r'|'.join(a), str, re.IGNORECASE))

答案 4 :(得分:8)

你需要迭代一个。

的元素
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"

答案 5 :(得分:3)

a = ['a', 'b', 'c']
str =  "a123"

a_match = [True for match in a if match in str]

if True in a_match:
  print "some of the strings found in str"
else:
  print "no strings found in str"

答案 6 :(得分:2)

jbernadas已经提到Aho-Corasick-Algorithm以降低复杂性。

以下是在Python中使用它的一种方法:

  1. here下载aho_corasick.py

  2. 将其放在与主Python文件相同的目录中,并将其命名为aho_corasick.py

  3. 使用以下代码尝试alrorithm:

    from aho_corasick import aho_corasick #(string, keywords)
    
    print(aho_corasick(string, ["keyword1", "keyword2"]))
    
  4. 请注意,搜索是区分大小写的

答案 7 :(得分:1)

在另一个字符串列表中查找多个字符串的一种紧凑方法是使用 set.intersection。这比大型集合或列表中的列表理解执行得快得多。

>>> astring = ['abc','def','ghi','jkl','mno']
>>> bstring = ['def', 'jkl']
>>> a_set = set(astring)  # convert list to set
>>> b_set = set(bstring)
>>> matches = a_set.intersection(b_set)
>>> matches
{'def', 'jkl'}
>>> list(matches) # if you want a list instead of a set
['def', 'jkl']
>>>

答案 8 :(得分:0)

我会将这种功能用于速度:

def check_string(string, substring_list):
    for substring in substring_list:
        if substring in string:
            return True
    return False

答案 9 :(得分:0)

data = "firstName and favoriteFood"
mandatory_fields = ['firstName', 'lastName', 'age']


# for each
for field in mandatory_fields:
    if field not in data:
        print("Error, missing req field {0}".format(field));

# still fine, multiple if statements
if ('firstName' not in data or 
    'lastName' not in data or
    'age' not in data):
    print("Error, missing a req field");

# not very readable, list comprehension
missing_fields = [x for x in mandatory_fields if x not in data]
if (len(missing_fields)>0):
    print("Error, missing fields {0}".format(", ".join(missing_fields)));

答案 10 :(得分:0)

关于如何获取String中所有列表元素的更多信息

a = ['a', 'b', 'c']
str = "a123" 
list(filter(lambda x:  x in str, a))

答案 11 :(得分:0)

一种出奇的快速方法是使用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")

如果a不包含任何多字符值(在这种情况下,使用above中列出的any),则此方法有效。如果是这样,将a指定为字符串:a = 'abc'更简单。

答案 12 :(得分:0)

另一个带有set的解决方案。使用set.intersection。要单线。

subset = {"some" ,"words"} 
text = "some words to be searched here"
if len(subset & set(text.split())) == len(subset):
   print("All values present in text")

if subset & set(text.split()):
   print("Atleast one values present in text")

答案 13 :(得分:0)

python regex中推荐的docs模块支持此功能

words = {'he', 'or', 'low'}
p = regex.compile(r"\L<name>", name=words)
m = p.findall('helloworld')
print(m)

输出:

['he', 'low', 'or']

有关实施的一些详细信息:link