在Python中检测re(正则表达式)对象

20 投票
4 回答
7740 浏览
提问于 2025-04-16 18:53

我想知道在Python中,怎样才能正确地检查一个对象是否是编译过的 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'

我不想用鸭子类型(也就是检查某些特定方法是否可用),因为这样可能会和其他类型发生冲突。

目前,我使用的是:

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

不过可能还有更好的方法……

4 个回答

1

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常需要将它们转换成程序可以使用的格式。

比如说,如果你从一个网页上获取了一些信息,这些信息可能是以文本的形式存在的。为了让程序能够处理这些信息,我们可能需要把它们转化为一个列表或者字典,这样程序才能更方便地使用这些数据。

在这个过程中,我们可能会用到一些工具或者库,这些工具可以帮助我们更轻松地完成数据的转换和处理。通过这些工具,我们可以节省很多时间,不用从头开始编写所有的代码。

总之,处理数据是编程中非常重要的一部分,掌握如何转换和使用数据会让你的编程技能更上一层楼。

import re

print isinstance(<yourvar>, re.RE_Pattern)
3

根据一些建议,你可以得到以下内容:

import re

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

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

re._pattern_type 这个东西是存在的,看起来可以满足你的需求:

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

不过,这样做并不是个好主意——根据 Python 的惯例,以 _ 开头的名字并不算是模块的公开接口,也不保证向后兼容。所以,使用 type(re.compile('')) 是最稳妥的选择——不过要注意,这也不一定能保证有效,因为 re 模块并没有说明从 re.compile() 返回的对象属于哪个特定的类。

实际上,即使这能得到保证,最符合 Python 风格并且兼容性最好的做法是依赖于 接口,而不是类型。换句话说,应该采用鸭子类型和 EAFP(即“尽量先尝试”)的方式,像这样做:

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

撰写回答