【问题标题】:How to copy a compiled regular expression?如何复制已编译的正则表达式?
【发布时间】: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


【解决方案1】:

由于已编译的正则表达式是不可变的,因此新引用实际上与副本相同。

p = re.compile( r'foo' )
p_copy = p

(如果写完以上p_copy的内容不适合您的目的,请在您的问题中提供更多上下文!)

【讨论】:

  • 这是一个非常好的答案,谢谢。我的问题是我不明白为什么默认情况下没有为编译的正则表达式实现复制,因为这会在尝试复制包含它们作为成员的类时导致问题,但显然这在 Python 3.7 中已修复(请参阅我的问题中的 cmets) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2017-01-13
  • 2022-11-25
相关资源
最近更新 更多