使用 SequenceMatcher 在多个字符串中查找常见片段
Find common fragments in multiple strings using SequenceMatcher
我想在以下之间找到共同的字符串:
strings_list = ['PS1 123456 Test', 'PS1 758922 Test', 'PS1 978242 Test']
下面的代码returns只有第一部分“PS1 1”,我想象的结果是“PS1 Test”。你能帮我吗,是否可以使用SequenceMatcher获得?提前致谢!
def findCommonStr(strings_list: list) -> str:
common_str = strings_list[0]
for i in range(1, n):
match = SequenceMatcher(None, common_str, strings_list[i]).get_matching_blocks()[0]
common_str = common_str[match.b: match.b + match.size]
common_str = common_str.strip()
return common_str
您需要保留所有片段,而不仅仅是第一个:
def get_common_str(strs: List[str]) -> str:
common_str = strs[0] if strs else ''
for str_ in strs[1:]:
common_str = ''.join(
common_str[m.a:m.a + m.size]
for m in SequenceMatcher(None, common_str, str_).get_matching_blocks()
)
return common_str
print(get_common_str(['PS1 123456 Test', 'PS1 758922 Test', 'PS1 978242 Test']))
这给出了
PS1 2 Test
这个问题很棘手,所以这种启发式方法可能并不总是有效,请随意想出另一种方法!看起来 SequenceMatcher 在您的案例中做得很好。不仅得到了常用词,还得到了分词,印象深刻。
这没有使用 SequenceMatcher 方法。如果所有的字符串都遵循相同的模式,你可以将它们拆分成白色的单词spaces.
strings_list = ['PS1 123456 Test', 'PS1 758922 Test', 'PS1 978242 Test']
test = []
for string in strings_list:
print(string.split())
test.append(string.split())
>>> ['PS1', '123456', 'Test']
['PS1', '758922', 'Test']
['PS1', '978242', 'Test']
现在你可以简单地做一个集合交集来找到共同的元素。参考:Python -Intersection of multiple lists?
set(test[0]).intersection(*test[1:])
>>> {'PS1', 'Test'}
# join them to get string
' '.join(set(test[0]).intersection(*test[1:]))
>>> PS1 Test
这只有在他们遵循这种由白色分隔的模式时才有效 space。
函数:
def findCommonStr(strings_list: list) -> str:
all_str = []
for string in strings_list:
all_str.append(string.split())
return ' '.join(set(all_str[0]).intersection(*all_str[1:]))
我想在以下之间找到共同的字符串: strings_list = ['PS1 123456 Test', 'PS1 758922 Test', 'PS1 978242 Test']
下面的代码returns只有第一部分“PS1 1”,我想象的结果是“PS1 Test”。你能帮我吗,是否可以使用SequenceMatcher获得?提前致谢!
def findCommonStr(strings_list: list) -> str:
common_str = strings_list[0]
for i in range(1, n):
match = SequenceMatcher(None, common_str, strings_list[i]).get_matching_blocks()[0]
common_str = common_str[match.b: match.b + match.size]
common_str = common_str.strip()
return common_str
您需要保留所有片段,而不仅仅是第一个:
def get_common_str(strs: List[str]) -> str:
common_str = strs[0] if strs else ''
for str_ in strs[1:]:
common_str = ''.join(
common_str[m.a:m.a + m.size]
for m in SequenceMatcher(None, common_str, str_).get_matching_blocks()
)
return common_str
print(get_common_str(['PS1 123456 Test', 'PS1 758922 Test', 'PS1 978242 Test']))
这给出了
PS1 2 Test
这个问题很棘手,所以这种启发式方法可能并不总是有效,请随意想出另一种方法!看起来 SequenceMatcher 在您的案例中做得很好。不仅得到了常用词,还得到了分词,印象深刻。
这没有使用 SequenceMatcher 方法。如果所有的字符串都遵循相同的模式,你可以将它们拆分成白色的单词spaces.
strings_list = ['PS1 123456 Test', 'PS1 758922 Test', 'PS1 978242 Test']
test = []
for string in strings_list:
print(string.split())
test.append(string.split())
>>> ['PS1', '123456', 'Test']
['PS1', '758922', 'Test']
['PS1', '978242', 'Test']
现在你可以简单地做一个集合交集来找到共同的元素。参考:Python -Intersection of multiple lists?
set(test[0]).intersection(*test[1:])
>>> {'PS1', 'Test'}
# join them to get string
' '.join(set(test[0]).intersection(*test[1:]))
>>> PS1 Test
这只有在他们遵循这种由白色分隔的模式时才有效 space。
函数:
def findCommonStr(strings_list: list) -> str:
all_str = []
for string in strings_list:
all_str.append(string.split())
return ' '.join(set(all_str[0]).intersection(*all_str[1:]))