Regexp匹配和弦,使用民族口音

2024-04-26 18:16:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理这个问题。我有*.txt文件,里面有几十首歌。每首歌可能包括

  • 姓名
  • 带和弦的线条
  • 歌词行
  • 空行

我正在编写Python脚本,它逐行读取文件。我需要用和弦来识别线条。为此,我决定使用正则表达式,因为它看起来很有趣,但对于此类任务来说是一个强大的工具。我是regexp新手,我做过这个tutorial(我很喜欢)。我写过这样的东西

\b ?\(?([AC-Hac-h]{1})(#|##|b|bb)?(is|mi|maj|sus)?\d?[ \n(/\(\))?]

我对此不太满意,因为它做得不好。问题之一是歌曲的语言使用了很多口音。第二个:和弦可能成对出现,例如C(D),h/e。你可以看到我的方法here。你知道吗

注意 为了在最终的脚本中获得更好的可读性,我将regexp分解成更多的变量,然后将这些变量相加。你知道吗

编辑

在重读我的问题之后,我想,我的目标可能不够明确。我想要很多不同类型的和弦,例如:

C, C#, Cis, c#, Cmaj, Cmi, Csus, C7, C#7, Db, Dbsus

有时也可能有(不超过两个)和弦相邻,例如:C7/D7, Cmi(a)。最好的解决方案是将这些“对”捕获在一个匹配C7/D7而不是C7D7的组合中。我认为,有了这个附加条件,它可能有点健壮,但是如果它不必要的困难,我可能会使用(我假设)更简单的版本(意思是:匹配C7D7而不是C7/D7),然后分别处理这个问题。你知道吗


Tags: 文件工具txt脚本歌词tutorial线条姓名
1条回答
网友
1楼 · 发布于 2024-04-26 18:16:56

Python脚本逐行读取文本文件,并希望通过正则表达式确定当前行是带有和弦的行还是带有其他信息的行。你知道吗

也许在每一行上应用正则表达式^[\t #()/\dAC-Hac-jmsu]+$就足够了。如果正则表达式不返回匹配项,则该行包含带和弦的行中不允许使用的字符。也许这个仅使用单个字符类定义的简单正则表达式就足够了。你知道吗

但有可能是一行有名字或歌词也符合上述表达。就你的例子来说,情况并非如此,但也可能如此。在这种情况下,我建议首先在每一行上使用函数strip(),从每一行的开始和结束处删除空格和制表符。然后应用以下正则表达式

^(?:[#()/\dAC-Hac-jmsu]{1,6}[\t ]+?)*[#()/\dAC-Hac-jmsu]{1,6}$

不同之处在于,现在每个不包含空格或制表符的字符串的长度必须在1到6之间。不允许使用较长的字符串。有了这个额外的规则,就可以在检测有和弦的线条时不再出现假阳性。你知道吗

和弦线检测规则的问题肯定是作为名称的字母或仅由和弦允许的字母组成的歌词文本也可能匹配。一个解决方案是创建一个字符串列表,其中只包含允许用于和弦的字母,并在OR表达式中使用它们。这就避免了名字或歌词串的误报。有了弦的完整列表,很可能也可以定义较短的规则,而不需要在OR表达式中列出所有弦。你知道吗

相关问题 更多 >