【python】用正则表达式从字符串中提取参数


class SGD(OptimizerBase):
    """ SGD 优化方法"""
    def __init__(self, lr=0.01):
        super().__init__()
        self.lr = lr

    def __str__(self):# 调用对象时候的打印方法。print( 对象) 打印的信息。
        lr = self.hyperparams["lr"]
        return f"SGD(lr={lr})"

    def update(self, params, params_grad, params_name):
        updata_value = self.lr * params_grad
        return params - updata_value # 梯度更新。


    @property
    def hyperparams(self): #返回字典。
        return {
     
            "op": "SGD",
            "lr": self.lr

        }

class OptimizerInitializer(ABC):
    def __init__(self, opti_name = "sgd"):
        self.opti_name = opti_name

    def __call__(self):
        r = r"([a-zA-Z]*)=([^,)]*)" 
        # lr=0.111 的。sgd_lr=0.2 
        opti_str = self.opti_name.lower()
        kwargs = dict([(i,eval(j)) for (i,j) in re.findall(r, opti_str)])
        if "sgd" in opti_str:
            optimizer = SGD(**kwargs)
        return optimizer

其中的正则表达:

r = r"([a-zA-Z]*)=([^,)]*)"

表示提取满足这样的十字的字符串的指定为两个位置(也就是两个括号内)的内容,返回的是所有满足这样形式的元组。
比如:

opti_str = "sgd_lr=0.2"
r = r"([a-zA-Z]*)=([^,)]*)"
re.findall(r, opti_str)

最后的re.findall(pattern,str)中的pattern表示匹配的样式,也就是在opti_str中找到所有满足这种样式的字符。
得到:

Out[66]: [('lr', '0.2')]

这样就可以通过:

 kwargs = dict([(i,eval(j)) for (i,j) in re.findall(r, opti_str)])
        if "sgd" in opti_str:
            optimizer = SGD(**kwargs)

实现两个功能,提取{“lr”:xxx}和判断优化器类型的作用。

当然:注意这样输入参数的时候需要将参数部分和类型部分用_分开:opt = OptimizerIntializer(xxxsgd_lr=0.001_xxxcang) 这样,并且参数名称需要与SGD的参数名def init(self, lr=0.01):一致。

你可能感兴趣的:(python)