<p>我的解决方案使用了一个有点复杂的正则表达式,它有两个优点:</p>
<ol>
<LI>如果一个数的扩展看起来是一个不可能的罗马数字的一部分,例如^ {CD1> },然后^ {< CD2> },天真的方法会考虑数字{{CD3}},而我的方法只考虑^ {CD1}},以{{CD2}}作为扩展。<李>
<li>如果您需要用更大的数字扩展应用程序,这将适用于非常大的数字</李>
</ol>
<p><strong>编辑:</strong>显然,对于和弦来说,数字越大可能没用,但谁知道呢?也许你会更新音乐的工作方式🎵 </p>
<p>我使用的正则表达式来自<a href="https://stackoverflow.com/a/267405/11489704">here</a>。我对它做了一点修改,使它在这里工作</p>
<pre class="lang-py prettyprint-override"><code>import re
l = ['ii7', 'vi7', 'V', 'IVadd9', 'Iadd9', 'V', 'IVmaj7', 'ii7', 'vi7', 'V', 'IVadd9', 'Iadd9', 'V', 'IVmaj7']
numerals = []
chord_type = []
extensions = []
roman_regex = '^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})'
for e in l:
roman_search = re.search(roman_regex , e.upper())
start = roman_search.start()
end = roman_search.end()
roman = e[start:end]
numerals.append(roman)
chord_type.append('maj' if roman[0].upper() == roman[0] else 'min')
extensions.append(e[end:])
</code></pre>
<pre class="lang-sh prettyprint-override"><code>>>> print(numerals)
... print(chord_type)
... print(extensions)
['ii', 'vi', 'V', 'IV', 'I', 'V', 'IV', 'ii', 'vi', 'V', 'IV', 'I', 'V', 'IV']
['min', 'min', 'maj', 'maj', 'maj', 'maj', 'maj', 'min', 'min', 'maj', 'maj', 'maj', 'maj', 'maj']
['7', '7', '', 'add9', 'add9', '', 'maj7', '7', '7', '', 'add9', 'add9', '', 'maj7']
</code></pre>