You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python字符串匹配:判断和弦字符串是否含列表内基础和弦前缀

判断带后缀的和弦是否包含基础和弦部分

我来帮你搞定这个问题~核心思路就是从带后缀的和弦字符串里提取出x:maj或者x:min格式的基础和弦部分,再检查它是否存在你给定的chordList里就行。这里有两种实用的实现方式:

方法1:字符串切割法(简单直接)

对于像F:maj/3这种带斜线后缀的和弦,直接按/分割取第一部分就行;对于D:min7这种带数字后缀的,我们可以找到:maj或:min的位置,提取前面的部分加上这个标记。

Python代码示例

chordList = ["N","C:maj","C:min","C#:maj","C#:min","D:maj","D:min","D#:maj","D#:min","E:maj","E:min","F:maj","F:min","F#:maj","F#:min","G:maj","G:min","G#:maj","G#min","A:maj","A:min","A#:maj", "A#:min", "B:maj","B:min"]

def has_valid_basic_chord(chord_str):
    # 先处理带斜线的情况,比如F:maj/3
    if '/' in chord_str:
        basic_part = chord_str.split('/')[0]
        return basic_part in chordList
    # 处理带数字后缀的情况,比如D:min7
    if ':maj' in chord_str:
        root = chord_str.split(':maj')[0]
        basic_part = f"{root}:maj"
        return basic_part in chordList
    if ':min' in chord_str:
        root = chord_str.split(':min')[0]
        basic_part = f"{root}:min"
        return basic_part in chordList
    # 都不匹配的话返回False
    return False

# 测试几个例子
print(has_valid_basic_chord("F:maj/3"))  # 输出True
print(has_valid_basic_chord("C:maj/4"))  # 输出True
print(has_valid_basic_chord("D:min7"))   # 输出True
print(has_valid_basic_chord("X:dim"))    # 输出False

方法2:正则表达式法(更健壮)

如果你的和弦后缀格式五花八门(比如maj9、minadd9这类),用正则表达式可以更精准地匹配出基础和弦部分,不会被复杂后缀干扰。

Python代码示例

import re

chordList = ["N","C:maj","C:min","C#:maj","C#:min","D:maj","D:min","D#:maj","D#:min","E:maj","E:min","F:maj","F:min","F#:maj","F#:min","G:maj","G:min","G#:maj","G#min","A:maj","A:min","A#:maj", "A#:min", "B:maj","B:min"]

def has_valid_basic_chord_regex(chord_str):
    # 正则匹配:音名(支持A-G和带#的) + :maj或:min(适配列表里"G#min"的冒号缺失情况)
    pattern = r'([A-G#]:?(maj|min))'
    match_result = re.search(pattern, chord_str)
    if match_result:
        basic_chord = match_result.group(1)
        return basic_chord in chordList
    return False

# 测试案例
print(has_valid_basic_chord_regex("F:maj/3"))  # True
print(has_valid_basic_chord_regex("D:min7"))   # True
print(has_valid_basic_chord_regex("G#min9"))   # True(因为列表里有"G#min")
print(has_valid_basic_chord_regex("B:aug"))    # False

小提醒

你给的chordList里有个"G#min",看起来像是笔误(少了冒号,应该是"G#:min"),如果是真的需要保留这个格式,正则方法里的pattern已经加了:?来适配可选的冒号,字符串切割法则需要额外处理这个例外情况哦~

内容的提问来源于stack exchange,提问作者user8894600

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:15:18