如何用re.sub精准移除歌词重复无意义串且不误删正常词汇
解决方案
原代码的问题在于用零散子串匹配,既无法精准覆盖连续重复的无意义序列,还容易误删正常词汇里的片段(比如nacht里的na会被误处理)。要精准移除目标字符串,需要针对独立且重复的无意义音节单元设计正则规则:
正则规则设计
- 匹配连续空格分隔的
na序列:\b(na\s+)+na\b\b确保na是独立单词,不会匹配正常词汇中的子串(na\s+)+匹配一个或多个带空格后缀的na- 末尾的
na匹配最后一个无空格后缀的na
- 匹配连续空格分隔的
ah-ah/ah-ah-ah这类单元:\b(ah(-ah)+\s+)+ah(-ah)+\bah(-ah)+匹配单个带连字符的ah单元(比如ah-ah、ah-ah-ah)- 同样用
\b确保是独立单元,避免误匹配
- 匹配独立的
yeah:\byeah\b
修改后的代码
import re lyrics = "say my name say my name drei zwei eins null baby make it rain baby ruf honigtopf tropft bleibe ganze nacht lang online yeah screenshots kopf na na na na na na na baby ruf honigtopf tropft bleibe ganze nacht lang online yeah screenshots kopf na na na na na na na ah-ah ah-ah ah-ah-ah ah-ah ah-ah ah-ah-ah ah-ah ah-ah ah-ah-ah ah-ah ah-ah ah-ah-ah ah-ah ah-ah ah-ah-ah ah-ah ah-ah ah-ah-ah ah-ah ah-ah ah-ah-ah ah-ah ah-ah ah-ah-ah" # 定义匹配规则 patterns = [ r'\b(na\s+)+na\b', # 匹配连续的na na na... r'\b(ah(-ah)+\s+)+ah(-ah)+\b', # 匹配连续的ah-ah ah-ah-ah... r'\byeah\b' # 匹配独立的yeah ] # 依次替换所有匹配项 for pattern in patterns: lyrics = re.sub(pattern, '', lyrics) # 清理替换后多余的连续空格 lyrics = re.sub(r'\s+', ' ', lyrics).strip() print(lyrics)
效果说明
运行后会精准移除所有目标无意义序列,同时保留nacht这类正常词汇中的na部分,最终输出:
say my name say my name drei zwei eins null baby make it rain baby ruf honigtopf tropft bleibe ganze nacht lang online screenshots kopf baby ruf honigtopf tropft bleibe ganze nacht lang online screenshots kopf
内容的提问来源于stack exchange,提问作者youngforever
相关产品推荐
相关产品推荐

