如何用正则表达式或通配符将多行文本压缩为少行并替换变量为通配符?
多行相似字符串的通配符压缩:工具与实现方案
可用工具
目前没有专门针对该需求的通用工具,但可以借助常见文本编辑器的正则替换功能变通实现:
- VS Code/Notepad++ 正则替换:利用正则捕获组匹配固定部分,将可变内容替换为通配符
*。
比如针对你的第一组输入,查找正则表达式Lorem ipsum dolor sit amet_(\d),替换为Lorem ipsum dolor sit amet_*;
第二组输入可使用Cursus risus at (\w+) mi tempus imperdiet,替换为Cursus risus at * mi tempus imperdiet。
自定义实现思路
如果需要自动化处理大量或更复杂的字符串,可以自己编写脚本实现,核心逻辑是分组+提取公共前后缀:
- 分组:将开头/结构相似的字符串归为同一组(可通过前缀匹配、哈希等方式实现);
- 提取公共部分:对每组内的字符串,计算最长公共前缀和最长公共后缀;
- 生成压缩结果:将前后缀之间的可变部分替换为
*; - 进阶处理:若存在中间多处可变的情况,可使用序列比对算法(如Levenshtein距离)识别公共子串,替换非公共部分。
Python 示例代码
def compress_similar_strings(str_list): # 按前缀分组(取前20个字符作为分组键,可根据实际调整长度) groups = {} for s in str_list: group_key = s[:20] groups.setdefault(group_key, []).append(s) compressed_lines = [] for group in groups.values(): # 计算最长公共前缀 common_prefix = group[0] for s in group[1:]: while not s.startswith(common_prefix): common_prefix = common_prefix[:-1] if not common_prefix: break # 计算最长公共后缀 common_suffix = group[0] for s in group[1:]: while not s.endswith(common_suffix): common_suffix = common_suffix[1:] if not common_suffix: break # 拼接压缩结果,处理前后缀重叠的特殊情况 if common_prefix and common_suffix: if group[0].startswith(common_prefix) and group[0].endswith(common_suffix): # 检查前后缀之间是否有内容 if common_prefix + common_suffix == group[0]: compressed = group[0] else: compressed = f"{common_prefix}*{common_suffix}" else: compressed = "*" else: compressed = "*" compressed_lines.append(compressed) return compressed_lines # 测试输入 input_lines = [ "Lorem ipsum dolor sit amet_0", "Lorem ipsum dolor sit amet_1", "Lorem ipsum dolor sit amet_2", "Cursus risus at ultrices mi tempus imperdiet", "Cursus risus at scelerisque mi tempus imperdiet" ] # 输出压缩结果 for line in compress_similar_strings(input_lines): print(line)
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

