Python 3.7+ 中应使用 isinstance(obj, re.Pattern) 判断是否为正则编译对象,re.Pattern 是官方稳定类型;Pattern 表示编译模板,Match 表示匹配结果,二者类型不同且不可混淆。

Python 中没有内置的“正则表达式对象类型”供直接 isinstance 判断——re.compile() 返回的对象类型是 re.Pattern(Python 3.7+),这是标准且可靠的判断依据。
用 isinstance 检查是否为 Pattern 对象
这是最推荐、最清晰的方式。re.Pattern 是正则表达式编译后的正式类型:
- import re
- pattern = re.compile(r'\d+') # 编译后得到 Pattern 对象
- print(isinstance(pattern, re.Pattern)) # True
- print(isinstance(r'\d+', re.Pattern)) # False(字符串不是)
- print(isinstance(re.search(r'\d+', '123'), re.Pattern)) # False(Match 对象不是 Pattern)
区分 Pattern 和 Match 对象
容易混淆的是:Pattern 是编译结果(模板),Match 是匹配结果(一次匹配的产物)。两者类型不同:
- pattern = re.compile(r'\d+') → 类型为 re.Pattern
- match_obj = pattern.search('abc123') → 类型为 re.Match(Python 3.7+)或 _sre.SRE_Match(旧版)
- 用 isinstance(match_obj, re.Match) 可判断是否为匹配结果对象
避免用 type(obj) == re.Pattern 的写法
虽然 type(pattern) 是 <class 're.Pattern'>,但直接比较 type 结果不够健壮(例如在某些导入方式或兼容场景下可能有差异)。isinstance 更安全,支持继承关系,也符合 Python 类型检查惯例。
不建议依赖字符串 repr 或 duck typing
不要通过 str(obj).startswith('<_sre.SRE_Pattern') 或 hasattr(obj, 'search') 等方式判断——这些属于实现细节,易失效且不可靠。re.Pattern 是公开稳定的类型接口,应优先使用。

















