python - 在一个字符串中查找多个子字符串,而无需对其进行多次遍历

标签 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)
但是,该代码多次遍历line(可能很长)-相当于_legal中的项目(可能很多)。这对于我来说太慢了,我正在寻找一种更快的方法。 line没有任何特定格式,因此据我所知,使用.split()无效。
编辑:更改line,以便更好地表示问题。

最佳答案

我可以想到的一种改进方法是:

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

  • 代码:
    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)))
    
    输出:
    {'thing1', 'fj la', 'thing2', 't5', '5'}
    

    关于python - 在一个字符串中查找多个子字符串,而无需对其进行多次遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64214769/

    相关文章:

    python - 如何很好地格式化dict字符串输出

    javascript - 为什么我的 for 循环没有递增,为什么我的拼接没有被改变?

    MySQL - 全文搜索

    python - 如何将工作表转换为字符串?或者我什至需要这样做?

    python - 无法使用 pyenv 切换 Python

    c++ - 字符串运算符+(重载)char数组和string.in cpp中的不同行为

    algorithm - 当段落包含Elasticsearch索引中的句子时匹配

    json - PostgreSQL 9.4 - jsonb 数组的元素到 ts_vector 中

    python - 将整数解释为枚举标志

    python - 没有任何现成的网络框架的异步 Python 3 HTTP 服务器。如何?