所以我在解析文本时遇到了问题。我正在尝试解析音乐文件,它们是半格式化的。例如,我试图从歌词中排除副歌。大多数情况下,格式如下所示:
[Chorus: x2] Some Lyrics Some More Lyrics [Verse] Lyrics Lyrics
In which case, these two functions can correctly parse:
subChorus = re.sub(r'\[Chorus.*?\].*?\[', '[', lyrics, flags = re.DOTALL);
subChorus2 = re.sub(r'\[Chorus.*?\].*?(\n{2,})', '', lyrics, flags = re.DOTALL);
但是,有时 Chorus 是文件的最后一部分:
Lyrics [Chorus] Some Lyrics Other Lyrics
In such a case, I cannot figure out the correct expression to remove the chorus. If I just do
subChorusEnd = re.sub(r'\[Chorus.*?\].*?$', '', lyrics, flags = re.DOTALL);
它会起作用;但是,对于最终合唱部分不在末尾的其他文件,它将删除需要保留的经文。所有带有以下诗句的合唱 block 都由至少两个换行符分隔。所以我想出了这个解决方案:
subChorusEnd = re.sub(r'\[Chorus.*?\][^(\n{2,})]*?$', '', subChorus4, flags = re.DOTALL);
但它不起作用。有人可以向我解释正确的正则表达式以使上述语句起作用或更好的方法仅删除一段文本末尾的合唱 block ,该文本段还将保留最终合唱不在末尾的文件.
最佳答案
您可以尝试使用下面的正则表达式来匹配所有合唱 block 。
\[Chorus.*?\].*?(\n{2,}|$)
或
(?!.*\n\n)\[Chorus.*?\].*?$
它只匹配最后的 chorus
block 。不要忘记在两个正则表达式中启用 DOTALL 修饰符。
关于排除多个换行符的 Python 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27630313/