<p>您希望使用命名的捕获组。这里有几个函数可以完成所有操作,还有一些演示代码:</p>
<pre><code># extract_midi_info.py
# For Python 2/3 compatibility
from __future__ import print_function
import re
NOTES = ("c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "b")
def notename_to_midi(notename):
return NOTES.index(notename[:-1].lower()) + (int(notename[-1])+2) * 12
def extract_midi_info(pattern, s):
pattern = pattern.replace("%midinote", r"(?P<midinote>\d+)")
pattern = pattern.replace("%velocity", r"(?P<velocity>\d+)")
pattern = pattern.replace("%notename", r"(?P<notename>[A-Ga-g]#?[0-9])")
m = re.match(pattern, s)
if m:
info = m.groupdict()
if 'midinote' in info:
info['midinote'] = int(info['midinote'])
if 'velocity' in info:
info['velocity'] = int(info['velocity'])
if 'notename' in info:
info['notename_midi'] = notename_to_midi(info['notename'])
else:
info = {}
return info
def main():
filelist_a = ["bonjour c3.wav", "bonjour c#3.wav", "bonjour d4.wav"]
pattern_a = "bonjour %notename.wav"
filelist_b = ["72__54.wav", "60__127.wav", "48__61.wav"]
pattern_b = "%midinote__%velocity.wav"
samples = [('A', filelist_a, pattern_a), ('B', filelist_b, pattern_b)]
for name, filelist, pattern in samples:
print()
print('Filelist {0}'.format(name))
for filename in filelist:
info = extract_midi_info(pattern, filename)
print(info)
print()
if __name__ == '__main__':
main()
</code></pre>