在哪里声明或存储函数中使用的已编译正则表达式?

时间:2019-06-27 11:42:27

标签: python

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

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

def is_specific_stuff(line):
    expr = re.compile('.*(specific|work)_stuff.*')
    return expr.match(line) is not None

我想写的代码:

expr = re.compile(...)

但是,我不知道该如何处理$user = "admin" $password = "pass" | ConvertTo-SecureString -asPlainText -Force $computer = "computer" $domain=$computer $username = $domain + "\" + $user $Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $username,$password $key = '\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters' $valuename = 'DiskSpaceThreshold' $wmi = Get-Wmiobject -list "StdRegProv" -namespace root\default -Computername $computer -Credential $Credential $value = $wmi.GetStringValue($HKEY_Local_Machine,$key,$valuename).svalue $wmi $value 。在哪里可以将编译后的正则表达式存储在一个模块范围内的常量中(我们有几个不同的正则表达式,并且我希望使其与需要可读性的代码保持一定的距离),并且无需在每次调用时都重新创建它? / p>

谢谢

1 个答案:

答案 0 :(得分:0)

有点黑,但是您可以使用某种装饰器来模仿static function variables.

尝试一下:

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"))

用法变得有些冗长,但使它的作用域仅限于函数,并且为了便于阅读而对其进行了定义。

注意: 您还可以使用带有默认值的参数(然后正常使用它),这也只会编译一次一次,但是问题是某些调用者可以在调用函数时覆盖该值...