【发布时间】:2020-04-13 20:05:45
【问题描述】:
Python 3 中是否有指定的方式来复制已编译的正则表达式?下面的代码抛出一个TypeError(与deepcopy相同),我不知道从那里去哪里。
import re
import copy
p = re.compile( r'foo' )
copy.copy(p) # TypeError: cannot copy this pattern object
我曾想过手动创建一个副本:
p_copy = re.compile(p.pattern, p.flags)
但我想知道这是否适用于所有可能的正则表达式;如果就这么简单,那参考库为什么不实现这样的copy呢?
【问题讨论】:
-
重点是什么?它们是不可变的。
-
那么就更简单了;它只需要返回自己,不是吗?当使用包含已编译的正则表达式作为成员的类时,它没有实现这一事实很麻烦,因为它需要编写自定义的
__copy__方法。我错过了什么明显的东西吗? -
如果这是问题所在,那么您说得对,这很麻烦,这就是它在 3.7 中得到修复的原因 - 尝试通过
copy模块复制模式现在将返回传入的模式对象. -
你几乎肯定不需要自己编译它。每个正则表达式在您第一次使用时都会被缓存。除非您使用超过 512 个正则表达式,否则缓存的对象永远不会过期。
-
(缓存不是 LRU 缓存;当您尝试使用第 513 个唯一的正则表达式时,会清除整个缓存。但是,偶尔重新编译正则表达式的成本不太可能会成为您程序中的任何瓶颈。)
标签: python regex python-3.x copy