2 回答
TA贡献1797条经验 获得超4个赞
我认为您需要捕获一个正则表达式@+ 字母/数字/下划线,它是"@(\w+)(匹配@1 个或多个字母/数字/下划线并用它们创建一个组)馈送到替换函数
import re
mydict = {'Cost1' : 10, 'Cost2' : 5, 'Cost3' : 1, 'Revenue1' : 10}
string = '@Cost1 + (@Cost2 + @Cost3) / @Revenue1 * 1.2'
expression = re.sub("@(\w+)",lambda m : str(mydict.get(m.group(1),0)),string)
结果:
'10 + (5 + 1) / 10 * 1.2'
这种方法非常有效,因为它使用字典查找而不是循环来替换和创建与变量一样多的字符串。
请注意,任何未知变量都会产生 0。如果您不想使用它mydict[m.group(1)]来触发关键错误。
该lambda要么是不是强制性的。你可以写一个真正的函数,只要它接受一个match对象作为输入并返回一个字符串作为输出:
def repfunc(m)
return str(mydict.get(m.group(1),0))
re.sub("@(\w+)",repfunc,string)
(这就是我们在获取值后转换为字符串的原因)
一旦你有了那个表达式,你就可以应用一个评估器 (eval是最简单但不太安全的,ast.literal_eval因为它不支持操作而无法工作,但还有其他的,例如simpleeval第三方模块(可以提供一个将进一步简化答案的变量列表),或此处的其他示例:评估字符串中的数学表达式)
TA贡献1757条经验 获得超7个赞
string = '@Cost1 + (@Cost2 + @Cost3) / @Revenue1 * 1.2'
mydict = {'Cost1' : 10, 'Cost2' : 5, 'Cost3' : 1, 'Revenue1' : 10}
string = string.replace('@', '')
for i in mydict:
string = string.replace(i, str(mydict[i]))
print(string)
print(eval(string))
输出:
10 + (5 + 1) / 10 * 1.2
10.72
添加回答
举报