Python 3.10 的 match 语法不支持通配符或正则匹配,需先用 pathlib.Path.suffixes 安全提取扩展名(如 ["json", "gz"]),再通过 match + 模式守卫分类处理,避免 str.split('.') 错误;预处理须统一转小写以兼容大小写敏感系统。

Python 3.10 的 match 语法本身不直接支持通配符或正则式扩展名匹配,它只做精确值、结构或类型匹配;想靠 match 单独实现“复杂文件扩展名过滤”会走错方向——得先提取扩展名,再用 match 分类处理。
如何从路径中安全提取扩展名并进入 match 分支
别用 str.split('.')[-1],它在 archive.tar.gz 或无扩展名文件(如 Dockerfile)上会出错。应优先用 pathlib.Path.suffix 或 suffixes:
-
Path("data.json.gz").suffix→".gz"(仅最后一个) -
Path("data.json.gz").suffixes→[".json", ".gz"](完整列表,适合多级压缩) - 对无扩展名文件,
.suffix返回空字符串"",.suffixes返回空列表[],这比抛异常更易在match中统一处理
用 match 匹配常见扩展名组合的典型写法
把 suffix 或 suffixes 结果作为 match 的目标,利用模式守卫(if)和序列解包应对复杂场景:
exts = Path(filename).suffixes
match exts:
case [".json"]: handle_json(filename)
case [".json", ".gz"] | [".json", ".zst"]: handle_compressed_json(filename)
case [".py"]: handle_python(filename)
case [".py", ".i"] if filename.endswith(".pyi"): handle_stub(filename) # 守卫进一步校验
case []: handle_no_ext(filename)
case _ if exts and exts[-1] in {".txt", ".log", ".md"}: handle_text(filename)
注意:case [".json", ".gz"] 是精确两元素匹配;case _ if ... 是兜底加条件判断,避免漏掉小众但合法的扩展组合。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
为什么不能直接 match Path(filename).stem 或完整路径
stem 是文件名不含扩展的部分,对扩展名过滤毫无意义;而完整路径字符串含目录层级,match 无法做子串匹配——它不等价于 if path.endswith(...)。常见错误包括:
- 写
match str(path)然后case "*.py":语法错误,match不支持 glob 模式 - 写
case "/home/*.py":这是字面量匹配,只会命中字面等于该字符串的路径 - 忽略大小写:Windows 下
.PY和.py都合法,但match区分大小写,需提前.lower()
真正关键的一步是预处理:统一转小写、用 suffixes 拆解、再进 match——否则所有分支都可能漏掉边缘情况。

















