将 re.compile 添加到列表

abd*_*lam 3 python regex python-3.x

当我编译正则表达式并将其分配给变量或将其添加到列表时,我怀疑在 Python 2.x 和 3.x 上得到不同的行为。

import re
z = re.compile('a')
print(z)
Run Code Online (Sandbox Code Playgroud)

上面的代码片段打印在 2.x 上

<_sre.SRE_Pattern object at 0x7ff839e57030>
Run Code Online (Sandbox Code Playgroud)

在 3.x 上

re.compile('a')
Run Code Online (Sandbox Code Playgroud)

第一个看起来像正则表达式被编译并准备好在我需要它时使用(这是我想要的),但第二个仍然说re.compile.

这是否意味着正则表达式会在我需要时即时编译,更糟糕的是每次引用z并执行类似操作时都会重新编译z.match('a')?或者,所描述的 Python 3 行为只是装饰性的,并且还在引擎盖下维护了一个编译副本?

我的观点是,我(静态地)在源文件的开头编译我的正则表达式,因此可以节省一些时间,以便我在循环中重复引用它们,但如果没有发生这种情况,那就不好了。

jon*_*rpe 5

所有这一切都意味着 the __repr__of_sre.SRE_Pattern已更改,从(不是非常有用的)默认值更改"<classname object at address>"为更有用的内容。根据数据模型文档(重点是我的):

如果可能的话,[__repr__对象的字符串表示]应该看起来像一个有效的 Python 表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果这是不可能的,<...some useful description...>则应返回表单的字符串。

比较 2.x:

>>> import re
>>> a = re.compile('a')
>>> a
<_sre.SRE_Pattern object at 0x02654440>
>>> type(a)
<type '_sre.SRE_Pattern'>
>>> repr(a)
'<_sre.SRE_Pattern object at 0x02654440>'
Run Code Online (Sandbox Code Playgroud)

和 3.x:

>>> import re
>>> a = re.compile('a')
>>> a
re.compile('a')
>>> type(a)
<class '_sre.SRE_Pattern'>
>>> repr(a)
"re.compile('a')"
Run Code Online (Sandbox Code Playgroud)

行为没有区别 - 正则表达式仍然只编译一次(这就是重点)。