Python re.sub未生效:无法移除重复字符串问题求助
问题原因及解决方法
你的代码失效核心有两个原因:
- 匹配逻辑错误:你把整个
duplicate的多行字符串直接塞进正则,相当于要匹配连续的三行(带换行),但old里的重复项是分散在其他行中的,自然匹配不到。 - 单词边界
\b不适用:这些编码是纯字母数字,前后的换行符不属于单词字符,\b无法正确锚定目标内容,反而会干扰匹配。
解决方案1:修正正则匹配
先把重复项拆成单独条目,构建能匹配任意重复项整行的正则,配合多行模式实现精准替换:
import re old = """ B07K6VMVL5 B071XQ6H38 B0B7F6Q9BH B082KTHRBT B0B78CWZ91 B09T8TJ65B B09K55Z433 """ duplicate = """ B0B78CWZ91 B09T8TJ65B B09K55Z433 """ # 提取有效重复条目,过滤空行 duplicate_items = [line.strip() for line in duplicate.splitlines() if line.strip()] # 构建正则:匹配任意重复项的整行(允许前后空白),开启多行模式 pattern = re.compile( r'^\s*(' + '|'.join(re.escape(item) for item in duplicate_items) + r')\s*$', re.MULTILINE ) # 替换重复行 final = pattern.sub('', old) # 清理多余空行 final = '\n'.join(line for line in final.splitlines() if line.strip()) + '\n' print(final)
解决方案2:不用正则,直接列表过滤(更直观高效)
对于这种行级别的去重,直接用集合做快速查找,再过滤行更简单:
old = """ B07K6VMVL5 B071XQ6H38 B0B7F6Q9BH B082KTHRBT B0B78CWZ91 B09T8TJ65B B09K55Z433 """ duplicate = """ B0B78CWZ91 B09T8TJ65B B09K55Z433 """ # 把重复项转为集合,提升查找效率 duplicate_set = {line.strip() for line in duplicate.splitlines() if line.strip()} # 过滤掉old中属于重复集合的行 filtered_lines = [line for line in old.splitlines() if line.strip() not in duplicate_set] # 重新拼接成字符串 final = '\n'.join(filtered_lines) + '\n' print(final)
两种方法最终输出都会是:
B07K6VMVL5 B071XQ6H38 B0B7F6Q9BH B082KTHRBT
内容的提问来源于stack exchange,提问作者Aravindh Arun
相关产品推荐
相关产品推荐

