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