python - 在哪里声明或存储函数中使用的编译正则表达式?
问题描述
我正在优化工作中的项目,在分析过程中我发现大部分时间都花在了即时编译正则表达式和匹配模式上。
我计划预编译正则表达式以节省执行时间,但我不知道我应该在哪里声明或存储它们。这是当前代码的示例:
def is_specific_stuff(line):
expr = ".*(specific|work)_stuff.*"
match = re.match(expr, line)
return bool(match)
我想写的代码:
def is_specific_stuff(line):
expr = re.compile('.*(specific|work)_stuff.*')
return expr.match(line) is not None
但是,我不知道我应该如何处理expr = re.compile(...)
。我可以在哪里存储已编译的正则表达式而不使其成为模块范围的常量(我们有几个不同的正则表达式,我想让它稍微接近需要它以提高可读性的代码),而不是在每次调用时重新创建它?
谢谢
解决方案
一种 hack,但您可以使用某种装饰器来模仿静态函数变量。
尝试这个:
import re
def static_vars(**kwargs):
def decorate(func):
for k in kwargs:
setattr(func, k, kwargs[k])
return func
return decorate
@static_vars(expr=re.compile('.*(specific|work)_stuff.*'))
def is_specific_stuff(line):
return is_specific_stuff.expr.match(line) is not None
print(is_specific_stuff("hello"))
print(is_specific_stuff("many important work_stuff to do"))
用法变得有点冗长,但它保持它的范围为函数,并在靠近它的地方定义以提高可读性。
注意: 您也可以使用具有默认值的参数(然后正常使用它),这也只编译 re 一次,但问题是某些调用者可以在调用函数时覆盖该值...
推荐阅读
- ios - 如何删除一组 GMSMarker?
- powershell - 使用 $PSScriptRoot 从另一个脚本执行 powershell 脚本?
- c++ - 朋友模板专业化
- javascript - 节点 mongodb 将数据存储为字符串而不是对象
- javascript - SyntaxError:bcrypt 模块的意外标识符
- r - 如何在 r 中使用 tidy-model 对数据进行反规范化
- google-workspace - 无法在 Cloud DNS 中编辑域
- c# - 如何在 Unity3D 中更准确地编辑框碰撞器?
- truncate - 在 Clickhouse 中的集群上截断表
- angular - 为 Angular 子路由添加 scrollPositionRestoration