首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >雷吉普与和弦相匹配,与国家口音相匹配

雷吉普与和弦相匹配,与国家口音相匹配
EN

Stack Overflow用户
提问于 2014-05-11 15:23:06
回答 1查看 126关注 0票数 2

我正在处理这个问题。我有包含数十首歌曲的*.txt文件。每首歌可能包括

  • 名字
  • 和弦线
  • 歌词行
  • 空行

我正在编写Python脚本,它逐行读取文件。我需要识别有和弦的线条。为此,我决定使用正则表达式,因为它看起来很好玩,但对于这些任务来说却是一个强大的工具。我刚开始使用regexp,我已经完成了这个教程 (我非常喜欢它)。我写过这样的东西

代码语言:javascript
复制
\b ?\(?([AC-Hac-h]{1})(#|##|b|bb)?(is|mi|maj|sus)?\d?[ \n(/\(\))?]

我对此不太满意,因为它不能很好地完成工作。其中一个问题是歌曲的语言使用了很多口音。第二个:和弦可能成对,例如C(D),h/e。你可以看到我的方法这里

为了在最终脚本中获得更好的可读性,我会将regexp拆分成更多的变量,然后将这些变量相加在一起。

编辑

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

代码语言:javascript
复制
C, C#, Cis, c#, Cmaj, Cmi, Csus, C7, C#7, Db, Dbsus

另外,有时在彼此之间可能有(不超过两个)和弦,例如:C7/D7, Cmi(a)。最好的解决方案是将这些“配对”放在一个匹配的C7/D7,而不是C7D7中。我认为,有了这个附加条件,它可能会有点健壮,但如果太困难,我可能会使用(我假设)更简单的版本(意思是:匹配C7D7而不是C7/D7),然后单独处理。

EN

回答 1

Stack Overflow用户

发布于 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字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23594411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档