Python中编译正则对象的类型

87 投票
9 回答
31462 浏览
提问于 2025-04-16 18:11

在Python中,编译后的正则表达式是什么类型的?

具体来说,我想要验证

isinstance(re.compile(''), ???)

这个表达式是否为真,以便进行一些内部检查。

我想到的一个解决办法是,定义一个全局常量 REGEX_TYPE = type(re.compile('')),但我觉得这看起来不太优雅。

编辑:我想这样做的原因是因为我有一个字符串列表和编译后的正则表达式对象。我想要将一个字符串与列表进行“匹配”,方法是:

  • 对列表中的每个字符串,尝试检查它们是否相等。
  • 对列表中的每个正则表达式,尝试检查这个字符串是否符合给定的模式。

我想到的代码是:

for allowed in alloweds:
    if isinstance(allowed, basestring) and allowed == input:
        ignored = False
        break
    elif isinstance(allowed, REGEX_TYPE) and allowed.match(input):
        ignored = False
        break

9 个回答

21

可以用're._pattern_type'来比较一个已经编译好的正则表达式。

import re
pattern = r'aa'
compiled_re = re.compile(pattern)
print isinstance(compiled_re, re._pattern_type)

>>True

在2.7版本中,这样做会返回True。

76

从Python 3.7开始,你可以使用 re.Pattern。这个功能很快就会在re的文档中说明,具体情况可以查看这个问题

如果你使用的是旧版本的Python,可以参考下面的内容:

Python 3.5引入了typing模块。在这个模块里,有一个叫typing.Pattern的东西,它是一个_TypeAlias

从Python 3.6开始,你可以简单地这样做:

from typing import Pattern

my_re = re.compile('foo')
assert isinstance(my_re, Pattern)

在3.5版本中,曾经有一个bug,让你必须这样做:

assert issubclass(type(my_re), Pattern)

而且根据文档和测试套件,这种做法并不能保证一定有效。

47

当某个东西的类型不太明确时,使用内置的 type 函数在运行时查找答案是完全可以的:

>>> import re
>>> retype = type(re.compile('hello, world'))
>>> isinstance(re.compile('goodbye'), retype)
True
>>> isinstance(12, retype)
False
>>> 

在运行时查找类型可以保护你不需要访问私有属性,也能避免未来返回类型发生变化带来的问题。在这里使用 type 并没有什么不优雅的地方,不过想要知道类型本身可能就有点不太优雅了。

不过,随着时间的推移,这个问题的背景也发生了变化。现在的 Python 版本中,调用 re.compile 的返回类型 现在是 re.Pattern

关于如果某个东西的类型不明确该怎么办的这个一般性问题依然有效,但在这个特定的情况下,re.compile(...) 的类型现在已经明确了。

撰写回答