Python对比相似字符串,提取起始重复后的差异子串
解决方案:提取字符串起始重复后的差异子串
核心思路
要解决这个问题,关键是先找到基准字符串(列表第一个元素)和每个目标字符串的最长公共前缀,然后从目标字符串中截掉这个前缀,剩下的就是需要的差异子串。
实现代码
通用实现(适用于所有字符串场景)
def get_suffix_differences(str_list): if not str_list: return [] base_str = str_list[0] differences = [] for s in str_list[1:]: # 计算最长公共前缀的长度 common_len = 0 # 逐字符对比,直到出现差异或其中一个字符串遍历完毕 while common_len < len(base_str) and common_len < len(s) and base_str[common_len] == s[common_len]: common_len += 1 # 截取差异部分 differences.append(s[common_len:]) return differences
路径场景优化(利用路径处理工具)
如果你的场景都是文件路径,可以借助os.path模块更精准处理:
import os def get_path_suffix_differences(path_list): if not path_list: return [] base_path = path_list[0] # 拆分基准路径的目录和文件名 _, base_filename = os.path.split(base_path) # 提取文件名的公共前缀(比如示例中的"file_") base_prefix = os.path.commonprefix([base_filename]) differences = [] for path in path_list[1:]: _, filename = os.path.split(path) # 去掉公共前缀得到差异部分 differences.append(filename[len(base_prefix):]) return differences
测试示例
简单字符串示例
str_lst = ['abcdefg','abcdefghi'] print(get_suffix_differences(str_lst)) # 输出: ['hi']
路径场景示例
sample_lst = ['c:/universal/bin/library/file_choice1.zip', 'c:/universal/bin/library/file_zebra1.doc', 'c:/universal/bin/library/file_alpha1.xlsx'] # 通用函数测试 print(get_suffix_differences(sample_lst)) # 输出: ['choice1.zip', 'zebra1.doc', 'alpha1.xlsx'] # 路径优化函数测试 print(get_path_suffix_differences(sample_lst)) # 输出: ['choice1.zip', 'zebra1.doc', 'alpha1.xlsx']
失败尝试分析
你之前的函数逻辑完全偏离需求:
- 用
split()默认按空格分割字符串,这和逐字符找前缀的目标不匹配; - 集合的
symmetric_difference是找两个集合的不交集,本质是对比单词层面的差异,和“提取起始重复后的子串”的需求无关。
内容的提问来源于stack exchange,提问作者John Taylor
相关产品推荐
相关产品推荐

