在Python中检测re(regexp)对象

时间:2011-06-03 10:55:36

标签: python regex types

我想知道什么是正确的pythonic向后兼容和向前兼容方法如何检查对象是否被编译re对象。

isinstance方法不能轻易使用,而生成的对象声称是_sre.SRE_Pattern对象:

>>> import re
>>> rex = re.compile('')
>>> rex
<_sre.SRE_Pattern object at 0x7f63db414390>

但没有这样的:

>>> import _sre
>>> _sre.SRE_Pattern
AttributeError: 'module' object has no attribute 'SRE_Pattern'

>>> import sre
__main__:1: DeprecationWarning: The sre module is deprecated, please import re.
>>> sre.SRE_Pattern
AttributeError: 'module' object has no attribute 'SRE_Pattern'

>>> re.SRE_Pattern
AttributeError: 'module' object has no attribute 'SRE_Pattern'

我不想使用duck typing(即检查某些特定方法的可用性),因为这可能会与其他一些类型冲突。

目前,我正在使用:

>>> RegexpType = type(re.compile(''))
>>> type(rex) == RegexpType
True

但可能有更好的方法..

4 个答案:

答案 0 :(得分:26)

re._pattern_type存在,似乎可以按照您的意愿行事:

>>> isinstance(re.compile(''), re._pattern_type)
True

但这不是一个好主意 - 根据Python惯例,以_开头的名称不是模块的公共API的一部分,也不是向后兼容性保证的一部分。因此,使用type(re.compile(''))是最好的选择 - 虽然注意到这也不能保证也能正常工作,因为re模块没有提到re.compile()返回的对象属于任何特定的类。

事实上,即使这是有保证的,最Pythonic和后向和前向兼容的方式将依赖于接口,而不是类型。换句话说,拥抱鸭子打字和EAFP,做这样的事情:

try:
     rex.match(my_string)
except AttributeError:
     # rex is not an re
else:
     # rex is an re

答案 1 :(得分:2)

根据您可以提出的一些建议:

import re

# global constant
RE_TYPE = re.compile('').__class__

def is_regex(a):
    return isinstance(a, RE_TYPE)

答案 2 :(得分:1)

similar question中除了你使用的解决方案之外没有任何答案,所以我认为没有更好的方法。

答案 3 :(得分:1)

import re

print isinstance(<yourvar>, re.RE_Pattern)