python - 从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 个罗马数字感到困惑,因为这些字符可能会再次出现在字符串中。
解决方案
如果罗马数字总是第一个,那么你可能会这样做
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
)。
推荐阅读
- mysql - ON DUPLICATE KEY UPDATE 针对特定索引或组合索引
- c++ - 键入时通过引用传递函数的问题
- google-cloud-platform - 谷歌云实例几个小时后随机超时?
- google-cloud-platform - 在 BigQuery 中运行联合查询到 Postgres Cloud SQL 实例时出现连接错误
- c++ - 删除旧的信号量 systemV
- javascript - 移动到 Windows 10 操作中心的 Chrome 通知无法清除?
- java - 使用 JPA 计算特定列
- javascript - 如何使用 puppeteer 生成可编辑的 PDF
- python - 为什么使用 docker-compose 在 Docker 容器中 Python 进程的父 pid 有时为 0?
- macos - Minikube 无法在带有 VPN 的 Mac 上启动