如何在Python中识别两个字符串的公共子串以展示字符串修改差异并标记新增内容
如何在Python中识别字符串新增子串并高亮展示?
我完全理解你的困扰——看起来简单的字符串差异比对,实际要只聚焦新增部分而忽略删除内容,确实容易卡在细节上。好在Python内置的difflib模块就能完美解决这个需求,不用找第三方工具,下面给你具体实现方案:
核心思路
我们可以利用difflib.SequenceMatcher类来比对新旧字符串,它会自动识别出相同子串、新增子串、删除子串和替换子串。根据你的需求,我们只保留相同部分和新增部分,并且用*标记新增内容,直接忽略删除的部分。
完整代码实现
import difflib def highlight_added_content(old_str, new_str): # 初始化比对器,不忽略任何字符 matcher = difflib.SequenceMatcher(None, old_str, new_str) result_parts = [] # 遍历所有比对操作 for tag, i_start, i_end, j_start, j_end in matcher.get_opcodes(): if tag == 'equal': # 相同子串直接添加 result_parts.append(old_str[i_start:i_end]) elif tag == 'insert': # 新增子串用星号高亮标记 result_parts.append(f'*{new_str[j_start:j_end]}*') # 忽略delete和replace操作中的删除部分,符合你不需要关注删除内容的需求 return ''.join(result_parts) # 测试你的示例字符串 string_old = "My name is pm730! How are you?" string_new = "My name isn't pm730, it is pm740!" output = highlight_added_content(string_old, string_new) print(output)
输出结果
运行上述代码后,你会得到符合预期的输出:
My name is n't pm730*, it is pm740*!
自定义扩展
如果需要替换高亮方式(比如用HTML红色字体代替星号),只需要修改insert分支的代码即可:
# 示例:用HTML标签高亮 result_parts.append(f'<span style="color:red;">{new_str[j_start:j_end]}</span>')
这个方案依赖Python内置库,不需要额外安装包,而且能处理各种复杂的字符串修改场景,比如多个分散的新增片段、连续新增内容等,比自己手写子串匹配逻辑靠谱得多。
内容的提问来源于stack exchange,提问作者Pm740
相关产品推荐
相关产品推荐

