为何glob('*[jp][pn]g')生效但glob('*p[ng][df]')无效?解析glob的[]语法
Python glob模块[]语法规则与问题解析
先搞懂glob里[]的核心逻辑
[]是单个字符的匹配范围,括号里的每个字符都是该位置的可选选项——比如[ab]只会匹配文件名中对应位置是a或者b的单个字符- 多个
[]按顺序对应文件名里的不同字符位置,比如[ab][cd]会匹配ac、ad、bc、bd这四种双字符组合
分析你的两段代码
为什么第一段返回空列表?
你写的*p[ng][df]模式,拆解后是:
*:匹配文件名开头任意长度的字符(包括空)p:必须紧跟一个p字符[ng]:p后面的字符必须是n或者g[df]:再后面的字符必须是d或者f
而你文件夹里的文件是png、jpg、pdf:
png的结构是p-n-g,最后一个字符是g,不符合[df]的要求,匹配不上pdf的结构是p-d-f,p后面的字符是d,不符合[ng]的要求,匹配不上jpg里根本没有p,直接被排除
自然就返回空列表了。
为什么第二段能匹配到jpg和png?
你写的*[jp][pn]g模式,拆解后:
*:匹配开头任意字符[jp]:对应位置是j或者p[pn]:下一个位置是p或者ng:最后必须是g
对应到文件:
jpg:[jp]选j,[pn]选p,加上最后的g,完美匹配jpgpng:[jp]选p,[pn]选n,加上最后的g,完美匹配png
所以这两类文件都能被捞出来。
额外:如果想匹配png和pdf该怎么写?
如果你的需求是匹配文件夹里的png和pdf,有两种直观写法:
- 用
[]精准匹配:*p[nd][gf]- 对应
png的p-n-g:[nd]选n,[gf]选g - 对应
pdf的p-d-f:[nd]选d,[gf]选f
- 对应
- 用大括号枚举更清晰:
*.{png,pdf}
大括号{}用于直接列出多个完整后缀,可读性更强,glob默认支持这种写法
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

