Python 如何计算字符串中表达式的值,然后返回新字符串?

Python 如何计算字符串中表达式的值,然后返回新字符串?,python,Python,我从配置文件中读取数据,如下所示: ip_vlan1 = "10.10.($id+100).5" ip_vlan2 = "10.11.($id*2+1).6" v.v... def calculate_vlan_id(id,ip_vlan): return ip_vlan.generate(id=id) 对于每个vlan,我希望根据ID和vlan表达式计算其vlan地址: def calculate_vlan_id(id, vlan_exp): ... return ip

我从配置文件中读取数据,如下所示:

ip_vlan1 = "10.10.($id+100).5"
ip_vlan2 = "10.11.($id*2+1).6"
v.v...
def calculate_vlan_id(id,ip_vlan):
  return ip_vlan.generate(id=id)
对于每个vlan,我希望根据ID和vlan表达式计算其vlan地址:

def calculate_vlan_id(id, vlan_exp):
    ...
    return ip_addr   # string
示例:

def(3, ip_vlan1) --> result: "10.10.103.5"
def(5, ip_vlan2) --> result: "10.11.11.6"
你有解决这个问题的办法吗


各位,先谢谢你们

如果你确定你只有“id”,那么你可以这样做

def calculate_vlan_id(id, vlan_exp):
    vlan_exp_list = vlan_exp.split(".") 
    vlan_exp_list[2].replace("$id", id);
    vlan_exp_list[2] = eval(vlan_exp_list[2])

return '.'.join(vlan_exp_list)  # string
def replace(id, vlan_exp):
    vlan_exp = vlan_exp.replace('$id',str(id))
    return ".".join(map(str,map(eval,vlan_exp.split('.'))))

但是使用eval和eval会对您的程序有害

如果你确定你只有“id”,那么你可以这样做

def replace(id, vlan_exp):
    vlan_exp = vlan_exp.replace('$id',str(id))
    return ".".join(map(str,map(eval,vlan_exp.split('.'))))

但是使用eval和eval会对您的程序有害

您可以使用文本模板引擎。(这比使用基于评估的技巧更安全)

下面是一个使用

如果您真的需要
calculate\u vlan\u id
函数,它将如下所示:

ip_vlan1 = "10.10.($id+100).5"
ip_vlan2 = "10.11.($id*2+1).6"
v.v...
def calculate_vlan_id(id,ip_vlan):
  return ip_vlan.generate(id=id)
编辑:

def(3, ip_vlan1) --> result: "10.10.103.5"
def(5, ip_vlan2) --> result: "10.11.11.6"
根据要求,这里有一个使用jinja2的示例:这可能不是最好的方法,jinja2文档很大,而且容易混淆

ip_vlan1 = jinja2.Template('10.10.{{id+100}}.5')
ip_vlan2 = jinja2.Template('10.11.{{2*id+1}}.6')
ip_vlan1.render(id=3)
ip_vlan2.render(id=5)

这两种方法都未经测试,您可以使用文本模板引擎。(这比使用基于评估的技巧更安全)

下面是一个使用

如果您真的需要
calculate\u vlan\u id
函数,它将如下所示:

ip_vlan1 = "10.10.($id+100).5"
ip_vlan2 = "10.11.($id*2+1).6"
v.v...
def calculate_vlan_id(id,ip_vlan):
  return ip_vlan.generate(id=id)
编辑:

def(3, ip_vlan1) --> result: "10.10.103.5"
def(5, ip_vlan2) --> result: "10.11.11.6"
根据要求,这里有一个使用jinja2的示例:这可能不是最好的方法,jinja2文档很大,而且容易混淆

ip_vlan1 = jinja2.Template('10.10.{{id+100}}.5')
ip_vlan2 = jinja2.Template('10.11.{{2*id+1}}.6')
ip_vlan1.render(id=3)
ip_vlan2.render(id=5)

这两种方法都未经测试。

您好,“$id”并不总是在[2]位置,它可以是任何位置。语句“vlan\u exp\u list[2]=eval(vlan\u exp\u list[2])错误:“SyntaxError:invalid syntax”您好,“$id”并不总是在[2]位置,它可以是任何位置。语句'vlan_exp_list[2]=eval(vlan_exp_list[2])错误:“SyntaxError:invalid syntax”很好&很清楚,也许我会更改我的配置文件格式以使用您的解决方案:D您是否有使用Jinja2模板的其他选项,请?非常感谢!您好,我找到了:从jinja2导入模板ip_vlan1=Template(“10.10.{id+100}}.5”)ip_vlan1.render(id=3)谢谢!很好,很清楚,也许我会改变我的配置文件格式来使用你的解决方案:D你有其他选择使用Jinja2模板吗?非常感谢!您好,我找到了:从jinja2导入模板ip_vlan1=Template(“10.10.{id+100}}.5”)ip_vlan1.render(id=3)谢谢!