Python中编译的正则expression式对象的types

python中编译正则expression式的types是什么?

我特别想评估一下

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

为真,为了内省的目的。

我有一个解决scheme是,有一些全局常量REGEX_TYPE = type(re.compile('')) ,但它似乎不是很优雅。

编辑:我想这样做的原因是因为我有string和编译正则expression式对象的列表。 我想通过“匹配”一个string

  • 对于列表中的每个string,尝试检查string是否相等。
  • 对于列表中的每个正则expression式,尝试检查string是否匹配给定的模式。

而我提出的代码是:

 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 

当某些东西的types没有被很好地指定时,使用内buildtype在运行时发现答案没有任何问题:

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

在运行时发现types可以防止您访问私有属性,并防止将来对返回types的更改。 在这里使用type没有任何不雅的地方,尽pipe可能会有些想要知道types的东西。

可以将编译的正则expression式与're._pattern_type'

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

至less在2.7版本中是真的

免责声明:这不是针对您的具体需求的直接答案,而是作为替代方法可能有用的东西


您可以保持鸭子打字的理想,并使用hasattr来确定对象是否具有您要使用的某些属性。 例如,您可以执行如下操作:

 if hasattr(possibly_a_re_object, "match"): # Treat it like it's an re object possibly_a_re_object.match(thing_to_match_against) else: # alternative handler 

预防胜于治疗。 首先不要创build这样的异构列表。 有一允许的string和编译的正则expression式对象的列表。 这应该使你的检查代码看起来更好,运行速度更快:

 if input in allowed_strings: ignored = False else: for allowed in allowed_regexed_objects: if allowed.match(input): ignored = False break 

如果无法避免创build这样的列表,请查看是否有机会检查一次,然后构build两个replace对象。

Python 3.5引入了typing模块。 其中包含了typing.re.Pattern_TypeAlias

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

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

在3.5中,曾经有一个bug要求你这样做:

 assert issubclass(type(my_re), Pattern) 

根据文档和testing套件不能保证工作。

FYI这样的代码的例子是在BeautifulSoup: http ://www.crummy.com/software/BeautifulSoup,并使用“hasattr”技术。 本着“替代方法”的精神,你也可以将你的stringsearch封装在正则expression式中:regexp = re.compile(re.escape(your_string)),因此只有一个正则expression式列表。

作为多态的一个例子,另一种解决scheme是创build实现一个通用方法的包装类。

 class Stringish (str): def matches (self, input): return self == input class Regexish (re): def matches (self, input): return self.match(input) 

现在你的代码可以遍历包含对象的alloweds列表,这些对象可以完全透明地实例化这两个类中的任何一个:

 for allowed in alloweds: if allowed.matches(input): ignored = False break 

还要注意一些代码重复如何消失(尽pipe你的原始代码可能被重构来单独修复)。

 >>> import re >>> regex = re.compile('foo') >>> regex <_sre.SRE_Pattern object at 0x10035d960> 

那么 – _sre是一个C扩展做模式匹配…你可以看看_sre C源代码。

你为什么在乎?

或者你尝试这样的事情(无论什么原因 – 我不在乎):

 >>> regex1 = re.compile('bar') >>> regex2 = re.compile('foo') >>> type(regex1) == type(regex2) True