我有一个字符串列表,包含用拉丁数字表示的和弦,如下所示:
['ii7', 'vi7', 'V', 'IVadd9', 'Iadd9', 'V', 'IVmaj7', 'ii7', 'vi7', 'V', 'IVadd9', 'Iadd9', 'V', 'IVmaj7']
我想把这些字符串分成3个子列表,如下所示:
numerals = ['ii', 'vi', 'V', 'IV', 'I', 'V', 'IV', 'ii', 'vi', 'V', 'IV', 'I', 'V', 'IV']
chord_type=['min', 'min', 'maj', 'maj', 'maj', 'maj','maj', 'min', 'min', 'maj', 'maj', 'maj', 'maj','maj']
extentions=['7','7','', 'add9','add9','','7','7','7','','add9','add9','','7']
(如您所见,大写罗马数字对应于和弦类型中的“maj”,非大写字母对应于“min”。)
在我的例子中,所有可能的罗马数字:
i, ii, iii, iv, v, vi, vii, I, II, III, IV, V, VI, VII
注意,我们不需要M
、C
、L
、X
我知道我可以从Python中的字符串中提取或拆分数字,如here所述,但如何提取罗马数字呢
我曾想过使用类似于matchregex的东西,但我对如何定义这7个罗马数字感到困惑,因为这些字符可能会再次出现在字符串中
使用
.startswith
string方法可以非常简单地做到这一点,如下所示:注释
nummerals
列表必须按长度排序(降序),以确保您匹配可能的最大数值(.startswith
for'ii7'
将同时匹配'i'
和'ii'
,但您需要第二个)李>StopIteration
错误。如果要防止这种情况发生,请向next
提供一个回退值李>若罗马数字总是在第一位,那个么你们可以这样做
输出
请注意,我使用了re.match,因为它是尝试将字符串开头的模式和有限的数字应用于示例中的现有数字(而不是使用所有已知的,即^{)
我的解决方案使用了一个有点复杂的正则表达式,它有两个优点:
编辑:显然,对于和弦来说,数字越大可能没用,但谁知道呢?也许你会更新音乐的工作方式🎵
我使用的正则表达式来自here。我对它做了一点修改,使它在这里工作
相关问题 更多 >
编程相关推荐