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
相关产品推荐
相关产品推荐

