【问题标题】:Adding re.compile to list将 re.compile 添加到列表中
【发布时间】:2014-11-25 12:25:13
【问题描述】:

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

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

sn-p 以上打印在 2.x 上

<_sre.SRE_Pattern object at 0x7ff839e57030>

在 3.x 上

re.compile('a')

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

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

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

【问题讨论】:

  • 你不清楚,没有区别
  • @Hackaholic,我认为你是对的,因为即使在 P3 上, print(z.__class__) 和 print(z.pattern) 都显示了预期的内容。因此,该对象已经创建。但是,我仍然不确定我是否真的喜欢 P3 对 SRE_Pattern 对象进行字符串化的方式。如果我们有一个包含 're.compile(\'a\')' 的字符串 var 怎么办?他们会打印完全一样的。也许是因为我习惯了P2方式。

标签: python regex python-3.x


【解决方案1】:

这意味着_sre.SRE_Pattern__repr__ 已从(不是非常有用的)默认"&lt;classname object at address&gt;" 更改为更有用的东西。每the data model documentation(强调我的):

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

比较 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')"

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

【讨论】:

  • 对,这一切都非常有意义,并且我想与其他语言(即 Java 字符串方法等)更好地对齐。非常感谢。
猜你喜欢
  • 2014-08-29
  • 2011-05-31
  • 2017-02-20
  • 2014-11-12
  • 1970-01-01
  • 2016-01-09
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多