在字符串中查找多个子字符串而不对其进行多次迭代

Yar*_*Gal 9 python string full-text-search

我需要查找列表中的项目是否出现在字符串中,然后将这些项目添加到不同的列表中。此代码有效:

data =[]
line = 'akhgvfalfhda.dhgfa.lidhfalihflaih**Thing1**aoufgyafkugafkjhafkjhflahfklh**Thing2**dlfkhalfhafli...'
_legal = ['thing1', 'thing2', 'thing3', 'thing4',...] 
for i in _legal:
    if i in line:
        data.append(i)
Run Code Online (Sandbox Code Playgroud)

但是,代码迭代line(可能很长)多次 - 与项目中的次数一样多_legal(可能很多)。这对我来说太慢了,我正在寻找一种更快的方法。line没有任何特定的格式,所以.split()据我所知使用是行不通的。编辑:更改line以更好地代表问题。

Som*_*ude 4

我能想到的改进方法之一是:

  • 获取单词的所有唯一长度_legal
  • line使用滑动窗口技术从这些特定长度构建单词词典。复杂度应该是O( len(line)*num_of_unique_lengths ),这应该比暴力破解要好。
  • thing现在在字典中查找每个内容的时间复杂度为 O(1)。

代码:

line = 'thing1 thing2 456 xxualt542l lthin. dfjladjfj lauthina '
_legal = ['thing1', 'thing2', 'thing3', 'thing4', 't5', '5', 'fj la']
ul = {len(i) for i in _legal}
s=set()
for l in ul:
    s = s.union({line[i:i+l] for i in range(len(line)-l)})
print(s.intersection(set(_legal)))
Run Code Online (Sandbox Code Playgroud)

输出:

{'thing1', 'fj la', 'thing2', 't5', '5'}
Run Code Online (Sandbox Code Playgroud)

  • @IoaTzimas 谢谢。我想我会添加自己的代码并测试诸如带有空格和添加的单词之类的东西。 (2认同)