python中的替换函数_Python:用Sympy替换函数,在数学表达式中是字符串?

您可以使用re.sub:import re

strip_f = lambda f: (f.split("(")[0], f.split("(")[1][:-1].split(", "))

def explicit(expr, functions):

d = {}

for f in functions:

func_vars, func_def = f.split(" = ")

func_name, func_vars = strip_f(func_vars)

d[func_name] = (func_vars, func_def)

def replace(match):

m = match.groups()[0]

fn_name, expr_vars = strip_f(m)

func_vars, s = d[fn_name]

for fv, ev in zip(func_vars, expr_vars):

s = s.replace(fv, "("+ev+")")

s = "("+s+")"

return s

return re.sub(r"(.\(([^\)]+,?)+?\))", replace, expr)

expr = '2*a*b + f(b+a, 2*b) + g(5, 2*c, 3+a)'

f1 = "f(x, y) = x + 2*y + 3"

f2 = "g(x, y, z) = x + y + z - 2"

print(explicit(expr, [f1, f2]))

显示:

^{pr2}$

正则表达式,细分为:( begin capturing group for function

. match any character (function nname)

\( match open parenthesis

( begin capturing group for variable

[^\)]+ match at least one non-parenthesis character

,? match a comma if it's there

) end variable capturing

+? match at least one variable

\) match close parenthesis

) end capturing group

如果不介意简化输出,可以使用前面提到的sympy方法:import sympy

expr = '2*a*b + f(b+a, 2*b) + g(5, 2*c, 3+a)'

f1 = "f(x, y) = x + 2*y + 3"

f2 = "g(x, y, z) = x + y + z - 2"

def split(fn):

return str(fn).partition("(")

def check_fn(ex):

name, sep, rest = split(ex)

return name and sep

def parse_functions(functions):

fns = {}

for f in functions:

name, _, rest = split(f)

fn = rest.split(" = ")

fns[name] = fn[0][:-1].split(", "), fn[1]

return fns

def expand(expr, functions):

fns = parse_functions(functions)

def sub_fn(ex):

with sympy.evaluate(False):

vs, fn = fns[split(ex)[0]]

fn = sympy.UnevaluatedExpr(sympy.sympify(fn))

return fn.subs(dict(zip(vs, str(ex)[2:-1].split(", "))))

return sympy.sympify(expr).replace(check_fn, sub_fn)

print(sympy.StrPrinter({'order':'none'})._print(expand(expr, [f1, f2])))

显示:2*a*b + a + b + 2*(2*b) + 3 + 5 + 2*c + a + 3 - 2

注意,这假设您需要完整的、未简化的、无序的方程。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值