排除多个换行符的 Python 正则表达式

标签 python regex regex-negation

所以我在解析文本时遇到了问题。我正在尝试解析音乐文件,它们是半格式化的。例如,我试图从歌词中排除副歌。大多数情况下,格式如下所示:

[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,}|$)

DEMO

(?!.*\n\n)\[Chorus.*?\].*?$

它只匹配最后的 chorus block 。不要忘记在两个正则表达式中启用 DOTALL 修饰符。

DEMO

关于排除多个换行符的 Python 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27630313/

相关文章:

python - 在巨大的表上操作 : group of rows at a time using python

python - 绘制 pandas 列的直方图

r - 根据正则表达式拆分data.table列

html - 来自组件的 Angular 4 模式验证

postgresql - postgres regexp_replace 否定连续字符组的存在

regex - 使用 Regex 捕获 HTML 注释但忽略特定注释

python - 如何指定正则表达式不匹配的内容

python - Selenium +Python : check attribute value

regex - Emacs - Subword 正则表达式说明

python - Scikit Learn - 交叉验证后对数据集进行评分