glob模块仅支持shell通配符,不支持正则表达式;需先用glob粗筛路径,再用re对文件名或完整路径进行正则精筛,注意转义、路径分隔符及递归选项。

glob 模块本身不支持正则表达式,它只支持 shell 风格的通配符(*、?、[abc]),不能写 \d+ 或 ^log.*\.txt$ 这类正则。想用正则匹配文件名,得先用 glob 粗筛,再用 re.match 或 re.fullmatch 精筛。
为什么不能直接把正则传给 glob.glob()?
glob.glob() 底层调用的是操作系统级的 glob(如 POSIX glob(3)),只认 *、?、[a-z] 这三类模式,遇到 \.、+、^ 会当作字面字符处理,不会触发正则逻辑。传入 r"log\d+\.txt" 不会报错,但只会匹配字面上叫 “log\d+.txt” 的文件(含反斜杠和加号)。
正确做法:glob + re 分两步过滤
先用 glob 获取一批候选路径(利用其高效遍历目录树的能力),再用 re 对 os.path.basename() 或完整路径做正则判断。这样既保留 glob 的便利性,又获得正则的表达力。
- 用
glob.glob("logs/*.txt")快速拿到所有 .txt 文件,避免扫描整个磁盘 - 对每个结果用
re.fullmatch(r"log\d{4}\.txt", os.path.basename(path))判断是否符合命名规范 - 若需匹配完整路径(比如要区分
logs/error.log和tmp/error.log),用re.search(r"logs/.*\.log$", path) - 注意
re.match()从开头匹配,re.fullmatch()要求完全一致,别漏掉$导致误匹配log12345.txt
常见坑:路径分隔符和转义问题
Windows 下 glob 返回路径含反斜杠 \,而正则中 \ 是转义符,直接写 r"logs\error\.log" 在 raw string 里没问题,但若拼接字符串或从变量读入,容易因双反斜杠或转义混乱导致匹配失败。
- 统一用
os.path.normpath()或pathlib.Path(path).as_posix()转成正斜杠,再喂给re - 文件名含括号、点、星号等正则元字符时,务必用
re.escape(filename_part)包裹,否则log*.txt会被当正则而非字面量 -
glob默认不递归;如需子目录,必须显式启用recursive=True并用**,例如glob.glob("src/**/*.py", recursive=True)
真正麻烦的不是写两行代码,而是搞清哪部分该由 glob 做(路径结构、层级、基础通配),哪部分必须交给 re(复杂命名规则、语义约束、动态条件)。混用时边界没划清,就容易漏文件或性能骤降。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











