我使用正则表达式从输入文本文件中提取和弦。虽然它大部分时间都在工作,但它在某个文件上失败了。
这是我的正则表达式代码:
def getChordMatches(line):
import re
notes = "[ABCDEFG]";
accidentals = "(?:#|##|b|bb)?";
chords = "(?:maj|min|m|sus|aug|dim)?"
additions = "[0-9]?"
chordFormPattern = notes + accidentals + chords + additions
fullPattern = chordFormPattern + "(?:/%s)?\s" % (notes + accidentals)
matches = [removeWhitespaces(x) for x in re.findall(fullPattern, line)]
positions = [x.start() for x in re.finditer(fullPattern, line)]
return matches, positions
这是它工作时的结果:
line: Em C C/B
matches: [u'Em', u'C', u'C/B']
position: [5, 20, 23]
此行来自未产生正确结果的文件:
line: Am Am/G D7/F# Fmaj7
matches: [u'Fmaj7']
position: [48]
我应该从哪里开始挖掘?编码、特殊字符、制表符……?
编辑
这是上面输出的来源:
line = unicode(l, encoding='utf-8')
matches, positions = getChordMatches(line)
print ' line:', line
print ' matches:', matches
print 'position:', positions
编辑
完整的正则表达式模式是:
[ABCDEFG](?:#|##|b|bb)?(?:maj|min|m|sus|aug|dim)?[0-9]?(?:/[ABCDEFG](?:#|##|b|bb)?)?\s
编辑
失败行的十六进制转储(我认为):
hexdump -s 45 -n 99 input.txt
000002d 20 41 6d 20 20 20 20 20 20 20 20 20 20 41 6d 2f
000003d 47 20 c2 a0 20 20 20 20 20 20 44 37 2f 46 23 20
000004d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
000005d 46 6d 61 6a 37 0a 49 20 6c 6f 6f 6b 20 61 74 20
000006d 79 6f 75 20 61 6c 6c 20 73 65 65 20 74 68 65 20
000007d 6c 6f 76 65 20 74 68 65 72 65 20 74 68 61 74 27
000008d 73 20 73
0000090
编辑
正如在接受的答案中提到的,它是由非中断空间引起的。使用line = unicode(l, encoding='utf-8').replace(u"\u00A0", " ")
可以解决问题。