首页 > 解决方案 > 在哪里声明或存储函数中使用的编译正则表达式?

问题描述

我正在优化工作中的项目,在分析过程中我发现大部分时间都花在了即时编译正则表达式和匹配模式上。

我计划预编译正则表达式以节省执行时间,但我不知道我应该在哪里声明或存储它们。这是当前代码的示例:

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(...)。我可以在哪里存储已编译的正则表达式而不使其成为模块范围的常量(我们有几个不同的正则表达式,我想让它稍微接近需要它以提高可读性的代码),而不是在每次调用时重新创建它?

谢谢

标签: python

解决方案


一种 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 一次,但问题是某些调用者可以在调用函数时覆盖该值...


推荐阅读