Zoo*_*Kep 3 python string split roman-numerals
我有一个字符串列表,其中包含表示为拉丁数字的和弦,如下所示:
['ii7', 'vi7', 'V', 'IVadd9', 'Iadd9', 'V', 'IVmaj7', 'ii7', 'vi7', 'V', 'IVadd9', 'Iadd9', 'V', 'IVmaj7']
Run Code Online (Sandbox Code Playgroud)
我想将这些字符串分成 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']
Run Code Online (Sandbox Code Playgroud)
(如您所见,大写字母的罗马数字对应和弦类型中的“maj”,非大写字母的罗马数字对应“min”。)
在我的例子中所有可能的罗马数字:
i, ii, iii, iv, v, vi, vii, I, II, III, IV, V, VI, VII
Run Code Online (Sandbox Code Playgroud)
请注意,我们不需要M, C, L, X。
我知道我可以从 Python 中的字符串中的字母中提取或拆分数字,如此处所述,但如何提取罗马数字?
我考虑过使用匹配正则表达式之类的东西,但我对如何定义这 7 个罗马数字感到困惑,因为这些字符可能会在字符串中再次出现。
如果罗马数字总是第一个那么你可能会这样做
import re
chords = ['ii7', 'vi7', 'V', 'IVadd9', 'Iadd9', 'V', 'IVmaj7', 'ii7', 'vi7', 'V', 'IVadd9', 'Iadd9', 'V', 'IVmaj7']
numerals = [re.match('[IiVv]+', i).group(0) for i in chords]
print(numerals)
Run Code Online (Sandbox Code Playgroud)
输出
['ii', 'vi', 'V', 'IV', 'I', 'V', 'IV', 'ii', 'vi', 'V', 'IV', 'I', 'V', 'IV']
Run Code Online (Sandbox Code Playgroud)
请注意,我使用了re.match ,因为它确实尝试将字符串开头的模式和有限的数字应用到示例中现有的(而不是使用所有已知的 ie IiVvXxLlCcDdMm)。