【发布时间】:2021-11-23 18:07:58
【问题描述】:
我需要将一个输入字符串与多个我称为固定字符串的字符串进行比较,您可以假设后者在执行期间不会改变。比较忽略带有特殊字符的字母,只考虑从 A 到 Z 的字母,但不区分大小写。我需要尝试将我的输入字符串与每个固定字符串的开头匹配,即使不是所有字符都匹配,与approximate string matching 不同。
换句话说,想要识别输入字符串中的每个单词和固定字符串中的每个单词之间的重叠。我对完整的比赛特别感兴趣,例如(love) 和 (love) 在下面的第二个示例中。
我实际上并不想显示匹配项,而是根据它们进行一些计算:每当有完全匹配时,我想增加一个具有特定值的计数器,并且只要有部分匹配,我想增加另一个值。计数是我真正想要的,但我需要先匹配字符串。
下面是如何匹配的说明:
如果我的固定字符串是“apple”、“bullcrap”、“tomato”、“apricot”,我应该能够搜索“Applecrab”并获得以下匹配项:
(Apple)crab App(l)ecrab Applecrab (Ap)plecrab
(apple) bul(l)crap tomato (ap)ricot
我也应该能够输入多个单词,例如:
固定字符串:“i love books”、“book fair”;输入字符串:“I love”;匹配:
(I) I I | love (love) l(o)ve
(i) love books | I (love) b(o)oks
I I | l(o)ve love
book fair | b(o)ok fair
比较两个字符串的简单、简单的算法如下所示:
inputString = "love".lower()
fixedString = "love".lower()
lenComp = min(len(inputString), len(fixedString))
counter = 0
for i in range(lenComp):
if inputString[i] == fixedString[i]: # Partial match
counter += 1
if counter == len(inputString): # Full match
counter += 10
print(counter) # 14
由于固定字符串的数量不是非常少,因此解决方案应该采用合适的数据结构。我在考虑树:prefix tree 似乎很合适,但它对字符串中间的松散匹配没有帮助,例如l(o)ve 和 b(o)oks,Aho–Corasick algorithm 也不会。我认为Hamming distance 也无济于事。我可以使用哪些数据结构/算法来实现这一目标?
我用 Python 标记它,因为我可能会使用它,但我现在不太关心实现。
【问题讨论】:
-
你如何从
Applecrab和banana到bul(l)crap? -
抱歉,刚刚修好了。
-
您是否真的想将每个输入词与固定字符串中的每个词进行比较,或者您是否想识别每个输入词有一些重叠的固定字符串并只显示这些?如果固定字符串集足够大,需要一个聪明的数据结构,那么您肯定不想一直显示所有空匹配项,如您的问题所示?
-
你的意思是Levenshtein distance吗?
-
@TMBailey 我想识别输入字符串中的每个单词和固定字符串中的每个单词之间的重叠。我对完整的比赛特别感兴趣,例如(love) 和 (love),但我实际上并不想显示这些匹配项,而是根据它们进行一些计算。我已经编辑了问题以进一步解释。
标签: python string search tree string-matching