将re.compile添加到列表中

时间:2014-11-25 12:25:14

标签: python regex python-3.x

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

import re
z = re.compile('a')
print(z)

以上代码段打印在2.x

<_sre.SRE_Pattern object at 0x7ff839e57030>

和3.x

re.compile('a')

第一个看起来像正则表达式已编译并准备好随时随地(这是我想要的)但第二个仍然说re.compile

这是否意味着我需要它时动态编译正则表达式,每次引用z并执行z.match('a')之类的操作时更糟糕的重新编译?或者描述的Python 3行为只是整容,它还保留了一个编译副本?

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

1 个答案:

答案 0 :(得分:3)

所有这些意味着__repr__ _sre.SRE_Pattern已被更改,从(非常有用的)默认"<classname object at address>"更改为更有用的内容。每the data model documentation(强调我的):

  

如果可能的话,[对象的__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>'

和3.x:

>>> import re
>>> a = re.compile('a')
>>> a
re.compile('a')
>>> type(a)
<class '_sre.SRE_Pattern'>
>>> repr(a)
"re.compile('a')"

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