我正在处理这个问题。我有包含数十首歌曲的*.txt文件。每首歌可能包括
我正在编写Python脚本,它逐行读取文件。我需要识别有和弦的线条。为此,我决定使用正则表达式,因为它看起来很好玩,但对于这些任务来说却是一个强大的工具。我刚开始使用regexp,我已经完成了这个教程 (我非常喜欢它)。我写过这样的东西
\b ?\(?([AC-Hac-h]{1})(#|##|b|bb)?(is|mi|maj|sus)?\d?[ \n(/\(\))?]我对此不太满意,因为它不能很好地完成工作。其中一个问题是歌曲的语言使用了很多口音。第二个:和弦可能成对,例如C(D),h/e。你可以看到我的方法这里。
为了在最终脚本中获得更好的可读性,我会将regexp拆分成更多的变量,然后将这些变量相加在一起。
编辑
在重读了我的问题后,我想,我的目标可能不够明确。例如,我想提出许多不同类型的和弦:
C, C#, Cis, c#, Cmaj, Cmi, Csus, C7, C#7, Db, Dbsus另外,有时在彼此之间可能有(不超过两个)和弦,例如:C7/D7, Cmi(a)。最好的解决方案是将这些“配对”放在一个匹配的C7/D7,而不是C7和D7中。我认为,有了这个附加条件,它可能会有点健壮,但如果太困难,我可能会使用(我假设)更简单的版本(意思是:匹配C7和D7而不是C7/D7),然后单独处理。
发布于 2014-05-18 10:45:40
Python脚本逐行读取文本文件,您希望使用正则表达式查找当前行是否是带有和弦或其他信息的行。
也许在每一行上应用正则表达式^[\t #()/\dAC-Hac-jmsu]+$就足够了。如果正则表达式不返回匹配,则行包含不允许使用和弦的行中的字符。也许这个简单的正则表达式只使用一个字符类定义就足够了。
但是,有可能是有名字或歌词的一行也与上面的表达相匹配。对于您的例子来说,情况并非如此,但可能是这样的。在这种情况下,我建议首先在每一行中使用函数strip(),从每一行的开始和结尾删除空格和制表符。然后应用以下正则表达式
^(?:[#()/\dAC-Hac-jmsu]{1,6}[\t ]+?)*[#()/\dAC-Hac-jmsu]{1,6}$
不同的是,现在每个不包含空格或制表符字符的字符串必须有1到6之间的长度,不允许使用较长的字符串。有了这个额外的规则,它可以是,不再有假阳性的检测与和弦线。
和弦线检测规则的问题在于字母作为名字或歌词文本,只有和弦允许的字母才能匹配。一个解决方案是创建一个字符串列表,该列表只包含允许和弦使用的字母,并在OR表达式中使用它们。这很可能是通过名字或歌词来避免假阳性。有了完整的chord字符串列表,也很有可能定义更短的规则,而不需要在OR表达式中列出所有的chord字符串。
https://stackoverflow.com/questions/23594411
复制相似问题