我需要人帮我弄清楚为什么我的正则表达式似乎不是决定性的

2024-06-26 14:53:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用正则表达式从输入文本文件中提取和弦。虽然它在大多数情况下对某个文件无效。在

这是我的regexp代码:

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

这是它工作时的结果:

^{pr2}$

这一行来自一个未生成正确结果的文件:

    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

编辑

完整的regex模式是:

[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", " ")解决了这个问题。在


Tags: 文件re编辑linenotesprintmajmatches
2条回答

我想问题是你给出的一行字符与和弦后面的\s不匹配,而regex表达式需要空格字符。无论如何,正则表达式都是错误的,因为它在最后一个和弦之后需要一个空格。在

尝试使用\b而不是\s

(评论后编辑)

我怀疑问题与以下两个字节有关:

000003d 47 20c2 a020 20。。。在

这似乎是一个UTF-8编码的非中断空格(U+00A0)。如果这就是你的正则表达式出错的原因,我也不会感到惊讶。在

相关问题 更多 >