首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中缓存已编译的正则表达式对象?

在Python中缓存已编译的正则表达式对象?
EN

Stack Overflow用户
提问于 2008-09-15 18:10:35
回答 6查看 3.7K关注 0票数 20

每次导入包含大量静态正则表达式的python文件时,都会花费cpu周期将字符串编译到内存中的代表性状态机中。

代码语言:javascript
复制
a = re.compile("a.*b")
b = re.compile("c.*d")
...

问:有没有可能以预编译的方式将这些正则表达式存储在磁盘上的缓存中,以避免在每次导入时执行正则表达式编译?

Pickling对象只会执行以下操作,导致无论如何都要进行编译:

代码语言:javascript
复制
>>> import pickle
>>> import re
>>> x = re.compile(".*")
>>> pickle.dumps(x)
"cre\n_compile\np0\n(S'.*'\np1\nI0\ntp2\nRp3\n."

re对象是不可编组的:

代码语言:javascript
复制
>>> import marshal
>>> import re
>>> x = re.compile(".*")
>>> marshal.dumps(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: unmarshallable object
EN

回答 6

Stack Overflow用户

发布于 2008-09-15 18:16:24

请注意,在应用程序的生命周期中,无论导入多少次,每个模块都只对自身初始化一次。因此,如果您在模块的全局范围内编译表达式(即。不是在一个函数中),你应该没问题。

票数 3
EN

Stack Overflow用户

发布于 2008-12-28 13:02:57

首先,这是python re模块中的一个明显的限制。它会限制正则表达式的合理数量和大小。对于长时间运行的进程,限制较大,而对于命令行应用程序等生命周期较短的进程,限制较小。

几年前,我确实研究过它,并且有可能挖掘出编译结果,对其进行筛选,然后将其解压并重新使用。问题是它需要使用sre.py内部结构,因此可能不能在不同的python版本中工作。

我希望在我的工具箱中有这样的功能。我还想知道,是否有任何单独的模块可以替代使用。

票数 2
EN

Stack Overflow用户

发布于 2008-09-15 19:14:25

shelve模块似乎工作得很好:

代码语言:javascript
复制
import re
import shelve
a_pattern = "a.*b"
b_pattern = "c.*d"
a = re.compile(a_pattern)
b = re.compile(b_pattern)

x = shelve.open('re_cache')
x[a_pattern] = a
x[b_pattern] = b
x.close()

# ...
x = shelve.open('re_cache')
a = x[a_pattern]
b = x[b_pattern]
x.close()

然后,您可以创建一个很好的包装类,它自动为您处理缓存,以便它对用户变得透明……留给读者的练习。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档