当我编译正则表达式并将其分配给变量或将其添加到列表中时,我怀疑在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行为只是整容,它还保留了一个编译副本?
我的观点是,我(静态地)在源文件的开头编译我的正则表达式,因此可以节省一些时间我在循环中重复引用它们但是如果没有发生,那就不好了。
答案 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')"
行为没有区别 - 正则表达式仍然只编译一次(这就是整点)。