我正在优化一个工作中的项目,在分析过程中,我发现大部分时间都花在即时编译正则表达式和匹配模式上。
我正在计划预编译正则表达式以节省执行时间,但是我不知道应该在哪里声明或存储它们。这是当前代码的示例:
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>
谢谢
答案 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"))
用法变得有些冗长,但使它的作用域仅限于函数,并且为了便于阅读而对其进行了定义。
注意: 您还可以使用带有默认值的参数(然后正常使用它),这也只会编译一次一次,但是问题是某些调用者可以在调用函数时覆盖该值...