在Wolfram Mathematica中,我可以定义命名模式,其中 _ (称为Blank)匹配任何表达式,然后在replacement rule中使用匹配 .

一个例子:

testexpr = p1[MM]*p2[NN] + p1[XX]*p2[MM] + p1[XX]^2;

    FunTest[expr_] := Expand[expr] /. {(p1[l1_]*p2[l2_]) -> FF1[l1]*FF2[l2], 
    p1[l1_]^n_ -> 0, p2[l1_]^n_ -> 0}

    FunTest[testexpr]

结果是 FF1[XX] FF2[MM] + FF1[MM] FF2[NN]

但是,我不知道如何在Python中使用sympy来做同样的事情 .

import sympy as sp

    p1 = sp.IndexedBase("p1")
    p2 = sp.IndexedBase("p2")

    FF1 = sp.IndexedBase("FF1")
    FF2 = sp.IndexedBase("FF2")

    MM,NN,XX=sp.symbols('MM NN XX')
    SSlist=[MM,NN,XX]

    testexpr=p1[MM]*p2[NN] + p1[XX]*p2[MM] + p1[XX]**2 

    def FunTest(expr): 
        expr=expr.subs([(p1[SS]*p2[SS2],FF1[SS]*FF2[SS2]) for SS in SSlist 
        for SS2 in SSlist]+[(p1[SS]**2,0) for SS in SSlist]+[(p2[SS]**2,0) 
        for SS in SSlist],simultaneous=True)
    return expr

   rest=FunTest(testexpr) 
   print(rest)

所以结果也是 FF1[MM]*FF2[NN] + FF1[XX]*FF2[MM] .

但是我想知道是否有一种简单的方法可以使它更加通用,就像Wolfram Mathematica一样 . 如果SSlist是一个大型列表并且存在许多不同的变量,那么使用我的解决方案将难以实现 .

我想知道是否有一种简单的方法,无需在整个列表中编写循环,对于SSlist中的SS,如在Mathematica中 . 熟悉情感的人可以给我任何提示吗?

非常感谢!