Wolfram mathematica 从大型表达式中提取与模式匹配的表达式

Wolfram mathematica 从大型表达式中提取与模式匹配的表达式,wolfram-mathematica,Wolfram Mathematica,我有一个Mathematica表达式,它包含一个平方根 expr = a / (b + Sqrt[c]); 其中a,b,c是大表达式。我想提取sqrt下的表达式,例如通过匹配模式,类似 Match[expr,Sqrt[x_]] // should return c 有没有一种简单的方法可以做到这一点?我在等待一些示例,但在此期间,请尝试: Cases[expr, x_^(1/2 | -1/2) :> x, Infinity] Sqrt(x)的标准内部形式是Power[x,1/2]理论

我有一个Mathematica表达式,它包含一个平方根

expr = a / (b + Sqrt[c]);
其中
a
b
c
是大表达式。我想提取sqrt下的表达式,例如通过匹配模式,类似

Match[expr,Sqrt[x_]] // should return c

有没有一种简单的方法可以做到这一点?

我在等待一些示例,但在此期间,请尝试:

Cases[expr, x_^(1/2 | -1/2) :> x, Infinity]

Sqrt(x)的标准内部形式是
Power[x,1/2]

理论上,这应该正常工作:

extractSqrt = Cases[ToBoxes@#, SqrtBox@x_ :> ToExpression@x, Infinity] &;

extractSqrt[expr]

如果您愿意将分配更改为
expr
,可以执行以下操作:

expr = Hold[a / (b + Sqrt[c])];

Cases[expr, HoldPattern @ Sqrt[x_] :> x, Infinity]
赋值语句中的
Hold
阻止Mathematica对表达式应用任何简化。在这种情况下,
Sqrt[c]
被“简化”为
Power[c,Rational[1,2]]


HoldPattern
Cases
表达式中非常重要,可以防止匹配的模式发生同样的简化。

@Sjoerd I imagine in在各种情况下都会失败:-/@Sjoerd我做了一个改变来抓更多的案子。@Sjoerd,请看我的其他答案。我没有时间测试它,但我认为它是解决方案。如果出现明显的故障,请留下评论。@Mr.Wizard好吧,当然还有a=0…%^的小例子)也不需要考虑a/(b+Hold[Sqrt[c]]),是吗?(只是开玩笑)。除此之外,它看起来像是你敲打的。@yoda在原始模式中没有负指数,并且a/(0+Sqrt[c])被编码为乘以[a,幂[c,有理[-1,2]]。您的第二个示例失败,因为无穷大表示从1到无穷大的级别,而c表示级别0。改用{0,无穷大}。在b+c中,b和c处于1级,因为它们处于加号[b,c]。因此,它在这种情况下起作用。