首页 > 解决方案 > 从python中的字符串中提取罗马数字

问题描述

我有一个字符串列表,其中包含表示为拉丁数字的和弦,如下所示:

['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 中的字符串中的字母中提取或拆分数字,如此处所述但是如何提取罗马数字?

我考虑过使用匹配正则表达式之类的东西,但我对如何定义这 7 个罗马数字感到困惑,因为这些字符可能会再次出现在字符串中。

标签: pythonstringsplitroman-numerals

解决方案


如果罗马数字总是第一个,那么你可能会这样做

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)

输出

['ii', 'vi', 'V', 'IV', 'I', 'V', 'IV', 'ii', 'vi', 'V', 'IV', 'I', 'V', 'IV']

请注意,我使用re.match尝试在字符串的开头应用模式,并将有限的数字应用到您的示例中(而不是使用所有已知的 ie IiVvXxLlCcDdMm)。


推荐阅读