如何从文件名中精准提取含#/b的调号?技术方案问询
精准提取文件名中调号的正则方案
需求回顾
需要从文件名中提取**A-G(含#/b组合)**的调号,需满足以下规则:
- 调号大小写不敏感
- 调号不在文件名开头
- 可位于()、[]内
- 前缀仅允许非字母数字符号(如.、空格、-、*等)
- 后缀可接符号、音频扩展名、数字(需截断),或min/maj/m/Min等字符(需截断)
优化后的正则方案
可以用单步正则直接捕获目标调号,无需二次过滤,表达式如下:
(?<![a-zA-Z0-9])([A-Ga-g][#b]?)(?:m(?:in(?:or)?)?|M(?:aj(?:or)?)?|\d|[^\w#b]|$)
正则规则拆解
(?<![a-zA-Z0-9]):反向零宽断言,确保调号前没有字母或数字,严格符合前缀规则([A-Ga-g][#b]?):核心捕获组,直接匹配目标调号:[A-Ga-g]:匹配大小写不敏感的A-G音名[#b]?:可选匹配升号#或降号b
(?:...):非捕获组,匹配所有需要截断的后缀内容:m(?:in(?:or)?)?|M(?:aj(?:or)?)?:覆盖所有大小写的min/maj/m/Minor/Major等调性后缀\d:匹配数字,遇到数字立即截断[^\w#b]|$:匹配非字母数字/#/b的符号(如.、-、空格)或文件名结尾,覆盖音频扩展名等场景
示例验证
对给定文件名测试,均可精准提取调号:
sample_F_one_shot.wav→ 提取结果:Fsample_oneshot_F#maj.wav→ 提取结果:F#sample_Ab_one_shot.wav→ 提取结果:Absample_(Cm_min).aif→ 提取结果:Csample_*Bb123.rx2→ 提取结果:Bb
使用注意
- 开启正则的大小写不敏感模式(如Python中
re.IGNORECASE,JavaScript中加/i修饰符) - 提取时直接取第一个捕获组的内容即可,无需后续处理
内容的提问来源于stack exchange,提问作者justewanproducer
相关产品推荐
相关产品推荐

