【发布时间】:2014-12-24 01:25:38
【问题描述】:
所以我在解析文本时遇到了问题。我正在尝试解析音乐文件,它们是半格式化的。例如,我试图从歌词中排除合唱。大多数情况下,格式如下所示:
[合唱:x2] 一些歌词 更多歌词 [诗] 歌词 歌词在这种情况下,这两个函数可以正确解析:
subChorus = re.sub(r'\[Chorus.*?\].*?\[', '[', lyrics, flags = re.DOTALL);
subChorus2 = re.sub(r'\[Chorus.*?\].*?(\n{2,})', '', lyrics, flags = re.DOTALL);
但是,有时合唱是文件的最后一部分:
歌词 [合唱] 一些歌词 其他歌词在这种情况下,我无法找出删除合唱的正确表达方式。如果我这样做
subChorusEnd = re.sub(r'\[Chorus.*?\].*?$', '', lyrics, flags = re.DOTALL);
它会起作用的;但是,对于其他最终合唱部分不在末尾的文件,它将删除需要保留的诗句。后面有诗句的所有合唱块至少由两个换行符分隔。所以我想出了这个解决方案:
subChorusEnd = re.sub(r'\[Chorus.*?\][^(\n{2,})]*?$', '', subChorus4, flags = re.DOTALL);
但它不起作用。有人可以向我解释正确的正则表达式以使上述语句起作用还是更好的方法来仅删除位于文本部分末尾的合唱块,该文本也将保留最终合唱不在末尾的文件.
【问题讨论】:
-
所以你只想删除作为结尾的部分,如果它在 Verse 之前保留它?
-
实际上,我将这些 Chorus-regex 替换中的几个与无数其他表达式组合在一起,以过滤文本。文本档案的格式并不完全相同,所以我目前有大约 8 个合唱文本正则表达式替换。但在这种特殊情况下,是的,我想要一个函数,如果它位于末尾,则删除该部分,否则保留它(标签通常不说诗句,通常不在 [] 分隔符中,而是合唱标签应该在 [Chrous.*?] 标签中)
-
@andoni 你的预期输出是什么?
-
您是说这个
\[Chorus.*?\].*?(\n{2,}|$)吗? regex101.com/r/kG6fX5/2 -
@AvinashRaj 这正是我想要的!非常感谢。我什至没有想过将它们与交替组合,所以我不会遇到无尾合唱块的问题!
标签: python regex regex-negation