【发布时间】:2019-11-04 22:27:37
【问题描述】:
我有一个函数定义,作为一个字符串,比如func_def = "f(x, y) = x + 2*y + 3"。
我有一个数学表达式,作为一个字符串,包括那个函数,比如expr = '2*a*b + f(b+a, 2*b)'。
如何在我的表达式中用函数的值替换函数?
换句话说,我如何得到一个字符串expr_eval = "2*a*b + ( (b+a) + 2*(2*b) + 3 )"?
是否有一个简单的解决方案,例如 Sympy 使用 sympify 和 subs 的组合以及其他一些功能?感觉应该有,但是没找到。我必须对包含许多符号的相当多的方程执行此操作,因此分别为每个方程创建 Sympy 符号似乎不是一个好选择。
目前,我使用正则表达式,但我发现这个解决方案难以提出、泛化(具有其他数量变量的其他函数)、缩放和阅读。它是这样的:
import re
func_def = "f(x, y) = x + 2*y + 3"
expr = '2*a*b + f(b+a, 2*b)'
# extract substring with function
str_to_replace = re.findall(r'f\([a-zA-z0-9\*\+\"\']*, [a-zA-z0-9\*\+\"\'/]*\)', expr)
str_to_replace = str_to_replace[0]
# extract function name and arguments in substring
func_name, args, _ = re.split('\(|\)', str_to_replace)
args = args.split(',')
args = [i.strip() for i in args]
# parse the function definition
func_def_lhs, func_def_rhs = func_def.split('=')
func_def_name, args_def, _ = re.split('\(|\)', func_def_lhs)
args_def = args_def.split(',')
args_def = [i.strip() for i in args_def]
# replace each argument in the definition by its expression
for i, arg_def in enumerate(args_def) :
func_def_rhs = func_def_rhs.replace(arg_def, '({})' .format(args[i]))
expr_eval = expr.replace(str_to_replace, '({})' .format(func_def_rhs))
【问题讨论】:
标签: python replace sympy symbolic-math mathematical-expressions