2014-11-25 178 views
2

当我编译正则表达式并将其分配给一个变量或将其添加到列表中时,我怀疑Python 2 x和3 x上的行为会有所不同。将re.compile添加到列表

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

你不清楚,没有什么区别 – Hackaholic 2014-11-25 12:32:20

+0

@Hackaholic,我认为你是对的,因为即使在P3上,print(z .__ class__)和print(z.pattern)也显示了预期的结果。所以,该对象已经创建。但是,我不确定我是否真的喜欢P3对SRE_Pattern对象进行字符串化的方式。如果我们有一个包含're.compile(\'a \')'的字符串变量呢?他们会打印完全一样的。也许这是因为我习惯了P2的方式。 – 2014-11-25 12:46:35

回答

3

所有这一切都意味着_sre.SRE_Pattern__repr__已被更改,从(不是非常有用的)默认"<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')" 

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

+0

对,这一切都非常有意义,并且与其他语言(即Java字符串方法等)更好地保持一致。非常感谢。 – 2014-11-25 13:07:53