regex 症状:使用野生符号替换

pvcm50d1  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(123)

我正在尝试进行泛型子表达式替换。
我想把任何形式为x*y的表达式替换为c
请注意,xy可以是表达式中的任何符号。
在下面的代码中,我使用Wild来实现这一点,但显然我无法只使用Wild匹配符号,而不是子表达式-即使使用isinstance=[sp.Symbol]

import sympy as sp
a, b, c = sp.symbols('a b c')

f= a*b - b

x = sp.Wild('x', isinstance=[sp.Symbol])
y = sp.Wild('y', isinstance=[sp.Symbol])

expr = f.replace(x*y, c)

这导致以下结果,

print expr
c

但预期的答案是:c - b

s1ag04yj

s1ag04yj1#

isinstance不是Wild的真实的参数。
你要找的参数是properties。虽然似乎没有文档记录,但参数接受一系列函数,这些函数应该对匹配的表达式为真。您可以使用它将符号与

In [7]: f= a*b - b

In [14]: y = sp.Wild('y', properties=[lambda x: isinstance(x, Symbol)])

In [15]: x = sp.Wild('x', properties=[lambda x: isinstance(x, Symbol)])

In [16]: f.replace(x*y, c)
Out[16]: -b + c
oxalkeyp

oxalkeyp2#

试试这个:

syms = sorted(set(a for a in f.atoms() if type(a) == sp.Symbol), key=str)
f.subs((s1*s2, c) for s1, s2 in it.combinations(syms, 2))

在这个例子中似乎工作得很好:

import itertools as it

a, b, c, d = sp.symbols('a b c d')
f = 3*a**2*b*c**b+b*c**2+25+(a+b+c*a/4)/(a*c+3**(b*c))-8

syms = sorted(set(a for a in f.atoms() if type(a) == sp.Symbol), key=str)
repls = [(s1*s2, d) for s1,s2 in it.combinations(syms, 2)]
print('variables:     ' + str(syms))
print('replacements:  ' + str(repls))

expr = f.subs(repls)
print('Before:  ' + str(f))
print('After:   ' + str(expr))

相关问题