新版本软弃用 re.match(),改用 re.prefixmatch()
来源: hugovk.dev — 2026-09-10
概述
作者先用一道小测验开场:re.match("pi","api") 不匹配,因为 re.match() 只在字符串开头匹配,这个「只锚定开头」的隐含行为是最老的 Python 陷阱之一。文章解释了 PEP 387 在 2023 年引入的「软弃用」:API 仍然被文档化和测试,只是不再发展、也不建议在新代码里使用,且不会发警告、也不会自动升级成删除。于是新版本新增了 re.prefixmatch() 作为 re.match() 的别名,并在文档里软弃用旧名字;同时给出对照:re.search() 两端都不锚定,re.match() 与 re.prefixmatch() 只锚定开头,re.fullmatch() 两端都锚定。他还给出用 Ruff 的 TID251 规则禁止 re.match() 的配置。
核心要点
- re.match() 只在字符串开头匹配,所以 re.match("pi","api") 不匹配,这是老陷阱。
- 软弃用意味着 API 仍保持文档与测试,只是不再增强,也不会发警告或必然被移除。
- 新版本新增 re.prefixmatch(),名字更直白地表达「只锚定前缀」。
- 对照选择:想任意位置匹配用 re.search(),想整串匹配用 re.fullmatch()。
- 可以用 Ruff 的 TID251(banned-api)规则在项目里直接禁掉 re.match()。
金句
用 re.prefixmatch() 的前提是你真的只想要这个半锚定;否则请用 re.search() 或 re.fullmatch()。
👍 0
👎 0
返回 Lobsters 首页