Python正则表达式检测音乐和弦? (改性)

时间:2014-07-25 01:00:10

标签: python regex

我正在用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"在"棒球"等

感谢您的帮助。

1 个答案:

答案 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'因为这样会以#结尾的和弦永远不会被接受。)