本文详解如何在 Python 中使用 glob 模块编写准确的通配符模式,匹配形如 123_beta_faces.nii.gz 或 042_beta_faces_up.nii.gz 的文件路径,避免过度匹配,并给出可直接运行的代码示例与关键注意事项。
本文详解如何在 python 中使用 `glob` 模块编写准确的通配符模式,匹配形如 `123_beta_faces.nii.gz` 或 `042_beta_faces_up.nii.gz` 的文件路径,避免过度匹配,并给出可直接运行的代码示例与关键注意事项。
在科学计算与医学影像处理(如使用 NiBabel 或 SimpleITK 读取 NIfTI 文件)中,常需批量加载符合特定命名规范的 .nii.gz 文件。你期望匹配的文件名格式为:三位数字 + _beta_ + 任意非空字符串 + .nii.gz,例如 123_beta_faces.nii.gz、007_beta_objects_left.nii.gz。
你原先使用的模式 *_beta_*nii.gz 存在两个关键问题:
- * 是贪婪通配符,会匹配零个或多个任意字符(包括路径分隔符 /、下划线 _,甚至可能跨目录),导致误匹配(如 x123_beta_y.nii.gz 或 test_123_beta_faces.nii.gz);
- 缺少对 .nii.gz 中字面量点号 . 的转义——*nii.gz 实际被解释为 *nii 后接任意单字符 g、再接 z,而非字面量 .nii.gz。
✅ 正确的 glob 模式应为:
import glob import os data_dir = "/path/to/your/nii_files" file_list = glob.glob(os.path.join(data_dir, "[0-9][0-9][0-9]_beta_*.nii.gz"))
该模式含义如下:
- [0-9][0-9][0-9]:严格匹配连续三个 ASCII 数字字符(000–999),不接受字母、下划线或更长/更短的数字串;
- _beta_:字面量字符串,确保中间固定分隔;
- *:匹配 _beta_ 之后、.nii.gz 之前的任意长度(含零)的合法文件名字符(不含 /),适用于 faces、faces_up、rest 等变体;
- .nii.gz:字面量点号和后缀,.nii.gz 中的 . 是普通字符,无需额外转义(glob 中 . 无特殊含义,仅 *、?、[...] 是元字符)。
⚠️ 注意事项:
- 不要用 f-string:原代码中 f'*_beta_*nii.gz' 是冗余的——模式中无变量插值,直接写字符串更清晰、安全;
- 区分 glob 与正则表达式:[0-9] 在 glob 中表示字符类,等价于 [0123456789],但不支持 \d 或 {3} 等正则语法;
- 跨平台兼容性:glob 默认区分大小写(Linux/macOS),若需忽略大小写,建议先用 glob.glob(..., recursive=False) 获取候选,再用 re.fullmatch(r'\d{3}_beta_.*\.nii\.gz', os.path.basename(p), re.I) 二次过滤;
- 验证路径有效性:glob.glob() 返回空列表时不会报错,建议添加检查:
if not file_list:
raise FileNotFoundError(f"No files matching pattern found in {data_dir}")
最终,file_list 将是一个包含完整绝对路径(或相对路径)的字符串列表,可直接传入 nib.load() 或 sitk.ReadImage() 进行批量读取。










