Python - 在字符串中查找字符串列表的出现

Dan*_*iar 2 python string performance search

我有一个大字符串和一个搜索字符串列表,并希望构建一个布尔列表,指示每个搜索字符串是否存在于大字符串中.在Python中执行此操作的最快方法是什么?

下面是一个使用天真方法的玩具示例,但我认为这可能是一种更有效的方法.

例如,下面的示例应返回[1,1,0],因为测试字符串中存在"hello"和"world".

def check_strings(search_list, input):
output = []
for s in search_list:
    if input.find(s) > -1:
        output.append(1)
    else:
        output.append(0)
return output
Run Code Online (Sandbox Code Playgroud)

search_strings = ["hello", "world", "goodbye"] test_string = "hello world" print(check_strings(search_strings, test_string))

Rob*_*obᵩ 5

我不能说这是否是最快的(这仍然是O(n*m)),但这是我这样做的方式:

def check_strings(search_list, input_string):
    return [s in input_string for s in search_list]
Run Code Online (Sandbox Code Playgroud)

以下程序可能更快或更快.它使用正则表达式来传递一个输入字符串.请注意,根据您的需要,您可能希望re.escape(i)re.findall()表达式中使用,也可以不使用.

def check_strings_re(search_string, input_string):
    import re
    return [any(l)
            for l in
            zip(*re.findall('|'.join('('+i+')' for i in search_string),
                            input_string))]
Run Code Online (Sandbox Code Playgroud)

这是一个完整的测试程序:

def check_strings(search_list, input_string):
    return [s in input_string for s in search_list]


def check_strings_re(search_string, input_string):
    import re
    return [any(l)
            for l in
            zip(*re.findall('|'.join('('+i+')' for i in search_string),
                            input_string))]


search_strings = ["hello", "world", "goodbye"]
test_string = "hello world"
assert check_strings(search_strings, test_string) == [True, True, False]
assert check_strings_re(search_strings, test_string) == [True, True, False]
Run Code Online (Sandbox Code Playgroud)