我正在用Python制作一个和弦转换器,并且大多数工作都有效,但是我的正则表达式存在一些问题,我想知道是否有人在正则表达式方面比我更聪明可能想知道如何修复。我基本上使用这个正则表达式,在另一个线程中找到:
import re
def findChords(line):
notes = "[CDEFGAB]";
accidentals = "(?:#|##|b|bb)?";
chords = "(?:maj|min|m|sus|aug|dim)?";
additions = "[0-9]?"
return re.findall(notes + accidentals + chords + additions, line)
# Case 1, which works:
line = "A A7 Am7 Bb Cmaj7"
print findChords(line)
['A', 'A7', 'Am7', 'Bb', 'Cmaj7']
# Case 2, which thinks the capital C in chorus is a chord.
line = "Chorus: A A7 Am7 Bb Cmaj7"
print findChords(line)
['C', 'A', 'A7', 'Am7', 'Bb', 'Cmaj7']
如您所见,"案例1"上面工作得很好。然而,"案例2"失败了,在#34; Chorus"这个词中思考大写C.是一个和弦。
有什么想法可以修改"笔记"正则表达式的一部分,所以它足够聪明,可以做出这种遗漏?它也应该省略像" B"在"棒球"等
感谢您的帮助。
答案 0 :(得分:1)
将r'\b'
添加到正则表达式的开头,将r'(?!\w)'
添加到最后,使正则表达式只能匹配“完整单词”(" word"是一系列字母数字字符和/或下划线):
def findChords(line):
notes = "[CDEFGAB]";
accidentals = "(?:#|##|b|bb)?";
chords = "(?:maj|min|m|sus|aug|dim)?";
additions = "[0-9]?"
return re.findall(r'\b' + notes + accidentals + chords + additions + r'(?!\w)', line)
(请注意,我们最后无法使用r'\b'
因为这样会以#
结尾的和弦永远不会被接受。)