Python “怎么做?”;逆;同位语替换?

Python “怎么做?”;逆;同位语替换?,python,sympy,Python,Sympy,我需要找到并用符号替换子表达式,进行某种“反向”替换 以下是直接替换示例: (simplify和collect已添加,以使生成的表达式具有我需要使用的表单) 现在我想回去,但是subs什么都不做: In [2]: orig_expr = subs_expr.subs(z_expr, z) ...: print(orig_expr) a + (b + 1)*(x + y) 如何返回到y*(b+1)+z*(b+1)?替换尝试失败,因为subs\u expr的表达式树中实际上不包含z\u e

我需要找到并用符号替换子表达式,进行某种“反向”替换

以下是直接替换示例:
simplify
collect
已添加,以使生成的表达式具有我需要使用的表单)

现在我想回去,但是
subs
什么都不做:

In [2]: orig_expr = subs_expr.subs(z_expr, z)
   ...: print(orig_expr)

a + (b + 1)*(x + y)

如何返回到
y*(b+1)+z*(b+1)

替换尝试失败,因为subs\u expr的表达式树中实际上不包含z\u expr。“替换不存在的表达式”并不是一个明确的目标。一个明确的目标是“使用关系
z=z_expr
消除A”。这可以通过以下方式实现:

var('orig_expr')
orig_expr = solve([orig_expr - subs_expr, z - z_expr], [orig_expr, a])[orig_expr]

现在
orig_expr
等于
b*y+b*z+y+z

替换尝试失败,因为subs_expr的表达式树中实际上不包含z_expr。“替换不存在的表达式”并不是一个明确的目标。一个明确的目标是“使用关系
z=z_expr
消除A”。这可以通过以下方式实现:

var('orig_expr')
orig_expr = solve([orig_expr - subs_expr, z - z_expr], [orig_expr, a])[orig_expr]

现在
orig_expr
等于
b*y+b*z+y+z

谢谢!“消除”在这里是一个非常好的术语。这对这个例子有效,但我不确定如何将这种方法推广到这类不同的问题。在这个例子中,为什么我需要求解
a
?因为需要有一个替换的目标。“找到所有出现的x并用y替换它们”就是这样一个目标,但当x是公式中没有明确表示的表达式时,这不起作用。因此,另一种说法是“使用关系x=y从公式中删除某些内容”。好吧,我可能过于简化了我的示例:
a
x
都在替换后删除,这不一定是事实。如果我的
subs\u expr=a+x+(b+1)*(a*y+x)
,我如何应用相同的技术?我想把它变成
(1+b)*z+x+(1+b)*a*y
。如果这个更复杂的表达式可以简化/解决,我很乐意编辑我的问题。目标是使用其定义引入
z
。您可以通过向表达式添加
z-z\u expr
来引入
z
。但你可能会说这不是你的意思。除非你能清楚地说明你想要的表达满足的要求(其他人不满足),否则你将无法向计算机解释。谢谢!“消除”在这里是一个非常好的术语。这对这个例子有效,但我不确定如何将这种方法推广到这类不同的问题。在这个例子中,为什么我需要求解
a
?因为需要有一个替换的目标。“找到所有出现的x并用y替换它们”就是这样一个目标,但当x是公式中没有明确表示的表达式时,这不起作用。因此,另一种说法是“使用关系x=y从公式中删除某些内容”。好吧,我可能过于简化了我的示例:
a
x
都在替换后删除,这不一定是事实。如果我的
subs\u expr=a+x+(b+1)*(a*y+x)
,我如何应用相同的技术?我想把它变成
(1+b)*z+x+(1+b)*a*y
。如果这个更复杂的表达式可以简化/解决,我很乐意编辑我的问题。目标是使用其定义引入
z
。您可以通过向表达式添加
z-z\u expr
来引入
z
。但你可能会说这不是你的意思。除非你能清楚地说明你想要的表达式满足的要求(其他人不满足),否则你将无法向计算机解释它。