我有一个Python字符串列表,想从所有名称中删除一个共同的子字符串。
在阅读了类似的 答案 后,我使用 SequenceMatcher
差不多可以达到期望的结果。
但只有当所有项都有一个共同的子字符串时才能实现:
From List:
string 1 = myKey_apples
string 2 = myKey_appleses
string 3 = myKey_oranges
common substring = "myKey_"
To List:
string 1 = apples
string 2 = appleses
string 3 = oranges
然而,我有一个稍微有些杂乱的列表,其中包含一些不符合同一命名约定的分散项。
我想从大多数中删除“最常见”的子字符串:
From List:
string 1 = myKey_apples
string 2 = myKey_appleses
string 3 = myKey_oranges
string 4 = foo
string 5 = myKey_Banannas
common substring = ""
To List:
string 1 = apples
string 2 = appleses
string 3 = oranges
string 4 = foo
string 5 = Banannas
我需要一种方法来匹配“myKey_”子字符串,以便可以从所有名称中删除它。
但是,当我使用SequenceMatcher
时,“foo”项目会导致“最长匹配”等于空白“”。
我认为解决这个问题的唯一方法是找到“最常见的子字符串”。但是如何实现呢?
基本示例代码:
from difflib import SequenceMatcher
names = ["myKey_apples",
"myKey_appleses",
"myKey_oranges",
#"foo",
"myKey_Banannas"]
string2 = names[0]
for i in range(1, len(names)):
string1 = string2
string2 = names[i]
match = SequenceMatcher(None, string1, string2).find_longest_match(0, len(string1), 0, len(string2))
print(string1[match.a: match.a + match.size]) # -> myKey_
s
(例如,apples
以s
结尾)。有两个感兴趣的数字:子字符串的长度和包含子字符串的搜索空间的百分比。当你增加其中一个时,另一个就会减少。 - Toothpick Anemone