繁体   English   中英

可以使用正则表达式替换sympy吗?

[英]Can regular expressions be used for the substitution in sympy?

假设我在sympy有一个符号计算,它通过向数字加错误来修改数字的基本算术运算:

from sympy import * 

p0,p1,p2 = symbols("p0:3")
ep0,ep1,ep2 = symbols("ep0:3")
x0,x1,x2 = symbols("x0:3")
ex0,ex1,ex2 = symbols("ex0:3")
q0,q1,q2 = symbols("q0:3")
eq0,eq1,eq2 = symbols("eq0:3")
r0,r1,r2 = symbols("r0:3")
er0,er1,er2 = symbols("er0:3")
n0,n1,n2 = symbols("n0:3")
en0,en1,en2 = symbols("en0:3")

p = Matrix([p0,p1,p2])
x = Matrix([x0,x1,x2])
q = Matrix([q0,q1,q2])
r = Matrix([r0,r1,r2])
n = Matrix([n0,n1,n2])

errors = []

def fl_op(a,b,op,e):
    return op(a,b)*(1 + e)

def fl_add(a,b):
    # Append an addition error to the global list of errors
    errors.append(symbols("err_add" + str(len(errors)+1)))
    return fl_op(a,b, lambda x,y : x + y, errors[-1]) 

def fl_sub(a,b):
    # Append an addition error to the global list of errors
    errors.append(symbols("err_sub" + str(len(errors)+1)))
    return fl_op(a,b, lambda x,y : x - y, errors[-1]) 

def fl_mul(a,b):
    # Append an addition error to the global list of errors
    errors.append(symbols("err_mul" + str(len(errors)+1)))
    return fl_op(a,b, lambda x,y : x * y, errors[-1]) 

def fl_div(a,b):
    # Append an addition error to the global list of errors
    errors.append(symbols("err_div" + str(len(errors)+1)))
    return fl_op(a,b, lambda x,y : x / y, errors[-1]) 

def fl_vsub(va,vb):
    assert (len(va) == len(vb))
    return [fl_sub(va[i],vb[i]) for i in range(len(va))]

def fl_vadd(va,vb):
    assert (len(va) == len(vb))
    return [fl_add(va[i],vb[i]) for i in range(len(va))]

def fl_vsum(va):
    return fl_add(fl_add(va[0],va[1]),va[2])

def fl_dot(va,vb):
    assert (len(va) == len(vb))
    return fl_vsum([fl_mul(va[i],vb[i]) for i in range(len(va))])

dotSub  = fl_sub(fl_dot(r,n), fl_dot(p,n))
dotSub = simplify(dotSub)
vSubDot = fl_dot(fl_vsub(r,p),n)
vSubDot = simplify(vSubDot)

打印(扩大(dotSub))

打印语句的结果是这样的:

-err_add10 * err_add9 * err_mul6 * err_sub11 * n0 * p0-err_add10 * err_add9 * err_mul6 * n0 * p0-err_add10 * err_add9 * err_add7 * err_sub11 * n1 * p1-err_add9 * er_9_er_add9 * er_1 * n0 * p0-err_add10 * err_add9 * err_sub11 * n1 * p1-err_add10 * err_add9 * n0 * p0-err_add10 * err_add9 * n1 * p1-err_add10 * err_mul6 * rr_sub11 * n0 * p0 -10 * err_mul7 * err_sub11 * n1 * p1-err_add10 * err_mul7 * n1 * p1-err_add10 * err_mul8 * err_sub11 * n2 * p2-err_add10 * err_mul8 * n2 * p2-err_add10 * err_sub11 * n- -err_add10 * err_sub11 * n2 * p2-err_add10 * n0 * p0-err_add10 * n1 * p1-err_add10 * n2 * p2 + err_add4 * err_add5 * err_mul1 * err_sub11 * n0 * r0 + err_add4 * * err_add5 * err_mul2 * err_sub11 * n1 * r1 + err_add4 * err_add5 * err_mul2 * n1 * r1 + err_add4 * err_add5 * err_sub11 * n0 * r0 + err_add4 * err_add5 * err_sub11 * n1 * err_add5 * n1 * r1 + err_add4 * err_mul1 * err_sub11 * n0 * r0 + err_add4 * err_mul1 * n0 * r0 + err_add4 * err_mul2 * err_sub11 * n1 * r1 + err_add4 * err_mul2 * n1 * r1 + err_add4 * err_sub11 * n0 * r0 + err_add4 * err_sub11 * n1 * r1 + err_add4 * n0 * r0 + err_add4 * n1 * r1 + err_add5 * err_0 err_mul1 * n0 * r0 + err_add5 * err_mul2 * err_sub11 * n1 * r1 + err_add5 * err_mul2 * n1 * r1 + err_add5 * err_mul3 * err_sub11 * n2 * r2 + err_add5 * err_mul3 * n + err_add5 * err_sub11 * n1 * r1 + err_add5 * err_sub11 * n2 * r2 + err_add5 * n0 * r0 + err_add5 * n1 * r1 + err_add5 * n2 * r2-err_add9 * err_mul6 * err_sub11 * n p0-err_add9 * err_mul7 * err_sub11 * n1 * p1-err_add9 * err_sub11 * n0 * p0-err_add9 * err_sub11 * n1 * p1-err_add9 * n1 * p1-err_add9 * n1 * p1 err_sub11 * n0 * r0 + err_mul1 * n0 * r0 + err_mul2 * err_sub11 * n1 * r1 + err_mul2 * n1 * r1 + err_mul3 * err_sub11 * n2 * r2 + err_mul3 * n2 * r2-err_mul6 * n0 * p0-err_mul7 * err_sub11 * n1 * p1-err_mul7 * n1 * p1-err_mul8 * err_sub11 * n2 * p2-err_mul8 * n2 * p2-err_sub11 * n0 * p0 + err_sub11 * n0 * r0- err_sub11 * n1 * r1-err_sub11 * n2 * p2 + err_sub11 * n2 * r2-n0 * p0 + n0 * r0-n1 * p1 + n1 * r1-n2 * p2 + n2 * r2

所有err_术语互不相同,但是它们的乘积可以忽略。 做这个的最好方式是什么? sympysubs函数sympy接受类似于所有err_项乘积的规则,使乘积等于0? 是否可以重载sympy符号的算术*运算符,以检查两个乘积操作数的名称是否都以err_ ,并以符号0 err_结果?

快速为err_项的err_指定所有可能的组合变得不可能,因为组合的数量增长非常快。

如果使用python.regex解析字符串以排除所有乘积,则可能会更容易。 这将如何运作?

我已经尝试了以下python regex ,但是它对字符串没有影响:

import regex
dotSubStr = str(expand(dotSub))
re.sub("[+,-,\s]err_*\*err_*\s",'', dotSubStr)

拿起第一个产品适用于

re.sub("err_(add|sub|mul|div)\d+\*err_(add|sub|mul|div)\d+",'', dotSubStr)

'-** n0 * p0-* err_mul6 * n0 * p0-** n1 * p1-* err_mul7 * n1 * p1-* err_sub11 * n0 * p0-* err_sub11 * n1 * p1-* n0 * p0-* n1 * p1-* err_sub11 * n0 * p0-* n0 * p0-* err_sub11 * n1 * p1-* n1 * p1-* err_sub11 * n2 * p2-* n2 * p2-* n0 * p0-* n1 * p1-* n2 * p2-err_add10 * n0 * p0-err_add10 * n1 * p1-err_add10 * n2 * p2 + ** n0 * r0 + * err_mul1 * n0 * r0 + ** n1 * r1 + * err_mul2 * n1 * r1 + * err_sub11 * n0 * r0 + * err_sub11 * n1 * r1 + * n0 * r0 + * n1 * r1 + * err_sub11 * n0 * r0 + * n0 * r0 + * err_sub11 * n1 * r1 + * n1 * r1 + * n0 * r0 + * n1 * r1 + err_add4 * n0 * r0 + err_add4 * n1 * r1 + * err_sub11 * n0 * r0 + * n0 * r0 + * err_sub11 * n1 * r1 + * n1 * r1 + * err_sub11 * n2 * r2 + * n2 * r2 + * n0 * r0 + * n1 * r1 + * n2 * r2 + err_add5 * n0 * r0 + err_add5 * n1 * r1 + err_add5 * n2 * r2-* err_sub11 * n0 * p0-* n0 * p0-* err_sub11 * n1 * p1-* n1 * p1-* n0 * p0-* n1 * p1-err_add9 * n0 * p0-err_add9 * n1 * p1 + * n0 * r0 + err_mul1 * n0 * r0 + * n1 * r1 + err_mul2 * n1 * r1 + * n2 * r2 + err_mul3 * n2 * r2-* n0 * p0-err_mul6 * n0 * p0-* n1 * p1-err_mul7 * n1 * p1-* n2 * p2-err_mul8 * n2 * p2-err_sub11 * n0 * p0 + err_sub11 * n0 * r0-err_sub11 * n1 * p1 + err_sub11 * n1 * r1-err _sub11 * n2 * p2 + err_sub11 * n2 * r2-n0 * p0 + n0 * r0-n1 * p1 + n1 * r1-n2 * p2 + n2 * r2'

因此,如果表达式最多具有3个乘积操作数,则此操作将删除乘积,但在乘积完好后保留所有内容,因此也应将其删除。

我弄清楚了如何使用regex过滤产品,以便在有人需要时回答。

从带有算术表达式的起始字符串开始:

-err_add10 * err_add9 * err_mul6 * err_sub11 * n0 * p0-err_add10 * err_add9 * err_mul6 * n0 * p0-err_add10 * err_add9 * err_add7 * err_sub11 * n1 * p1-err_add9 * er_9_er_add9 * er_1 * n0 * p0-err_add10 * err_add9 * err_sub11 * n1 * p1-err_add10 * err_add9 * n0 * p0-err_add10 * err_add9 * n1 * p1-err_add10 * err_mul6 * rr_sub11 * n0 * p0 -10 * err_mul7 * err_sub11 * n1 * p1-err_add10 * err_mul7 * n1 * p1-err_add10 * err_mul8 * err_sub11 * n2 * p2-err_add10 * err_mul8 * n2 * p2-err_add10 * err_sub11 * n- -err_add10 * err_sub11 * n2 * p2-err_add10 * n0 * p0-err_add10 * n1 * p1-err_add10 * n2 * p2 + err_add4 * err_add5 * err_mul1 * err_sub11 * n0 * r0 + err_add4 * * err_add5 * err_mul2 * err_sub11 * n1 * r1 + err_add4 * err_add5 * err_mul2 * n1 * r1 + err_add4 * err_add5 * err_sub11 * n0 * r0 + err_add4 * err_add5 * err_sub11 * n1 * err_add5 * n1 * r1 + err_add4 * err_mul1 * err_sub11 * n0 * r0 + err_add4 * err_mul1 * n0 * r0 + err_add4 * err_mul2 * err_sub11 * n1 * r1 + err_add4 * err_mul2 * n1 * r1 + err_add4 * err_sub11 * n0 * r0 + err_add4 * err_sub11 * n1 * r1 + err_add4 * n0 * r0 + err_add4 * n1 * r1 + err_add5 * err_0 err_mul1 * n0 * r0 + err_add5 * err_mul2 * err_sub11 * n1 * r1 + err_add5 * err_mul2 * n1 * r1 + err_add5 * err_mul3 * err_sub11 * n2 * r2 + err_add5 * err_mul3 * n + err_add5 * err_sub11 * n1 * r1 + err_add5 * err_sub11 * n2 * r2 + err_add5 * n0 * r0 + err_add5 * n1 * r1 + err_add5 * n2 * r2-err_add9 * err_mul6 * err_sub11 * n p0-err_add9 * err_mul7 * err_sub11 * n1 * p1-err_add9 * err_sub11 * n0 * p0-err_add9 * err_sub11 * n1 * p1-err_add9 * n1 * p1-err_add9 * n1 * p1 err_sub11 * n0 * r0 + err_mul1 * n0 * r0 + err_mul2 * err_sub11 * n1 * r1 + err_mul2 * n1 * r1 + err_mul3 * err_sub11 * n2 * r2 + err_mul3 * n2 * r2-err_mul6 * n0 * p0-err_mul7 * err_sub11 * n1 * p1-err_mul7 * n1 * p1-err_mul8 * err_sub11 * n2 * p2-err_mul8 * n2 * p2-err_sub11 * n0 * p0 + err_sub11 * n0 * r0- err_sub11 * n1 * r1-err_sub11 * n2 * p2 + err_sub11 * n2 * r2-n0 * p0 + n0 * r0-n1 * p1 + n1 * r1-n2 * p2 + n2 * r2

可以像这样使用regex删除err_*术语的所有多个乘积:

import re
dotSubFinal = re.sub("(err_(add|sub|mul|div)\d+\*){2,}",'del', dotSubStr)
dotSubFinal = re.sub("[+-]\s*del[npr]\d\*[npr]\d",'', dotSubFinal)
dotSubFinal = re.sub("\s{2,}",'', dotSubFinal)

导致 :

打印(dotSubFinal)

-err_add10 * n0 * p0-err_add10 * n1 * p1-err_add10 * n2 * p2 + err_add4 * n0 * r0 + err_add4 * n1 * r1 + err_add5 * n0 * r0 + err_add5 * n1 * r1 + err_add5 * p0-err_add9 * n1 * p1 + err_mul1 * n0 * r0 + err_mul2 * n1 * r1 + err_mul3 * n2 * r2- err_mul6 * n0 * p0- err_mul7 * n1 * p1- err_mul8 * n2 * p2-err_sub011 * r0-err_sub11 * n1 * p1 + err_sub11 * n1 * r1-err_sub11 * n2 * p2 + err_sub11 * n2 * r2-n0 * p0 + n0 * r0-n1 * p1 + n1 * r1-n2 * p2 + n2 * r2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM