给出一个表达式,如
(exp(-((-mx + x - y)^2/(2 s1^2))2x - 2y (-my + y)^2/(2 s2^2)))/(2
pi sqrt(s1^2) sqrt(s2^2)
什么是检测所有乘法发生的简单方法?上述表达式是唯一定义的。变量不能以数字开头,而且两个变量的乘数总是用空格分隔。
即。可以使用正则表达式(或其他方法)将上述内容转换为
(exp(-((-mx + x - y)^2/(2*s1^2))*2*x - 2*y*(-my + y)^2/(2*s2^2)))/(2*
pi*sqrt(s1^2)*sqrt(s2^2)
首选Python或正则表达式解决方案。
答案 0 :(得分:1)
首先,您应该清楚地定义何时插入*
以及何时不插入,以避免更改,例如exp(
到e*x*p*(
。现在,创建一些匹配这些情况的正则表达式。
patterns = [r"([0-9])\s*([a-z(])", # matches '2x', '2 x', or '2 ('
r"([a-z])\s+([a-z])", # matches 'x y', but not 'xy'
r"([a-z])\s+(\()", # matches 'x (', but not 'x('
r"(\))\s*([0-9a-z(])"] # matches ')x', ')2', ') x', ') (', etc.
使用re.findall
来测试这些内容。最后,您必须替换表达式中的这些模式。您可以将re.sub
与替换r"\1*\2"
一起使用。在此,\1
和\2
是模式中匹配的组。
expr = "(exp(-((-mx + x - y)^2/(2 s1^2))2x - 2y (-my + y)^2/(2 s2^2)))/(2pi sqrt(s1^2) sqrt(s2^2)"
for p in patterns:
expr = re.sub(p, r"\1*\2", expr)
之后,expr
看起来非常像您问题中的示例:
(exp(-((-mx + x - y)^2/(2*s1^2))*2*x - 2*y*(-my + y)^2/(2*s2^2)))/(2*pi*sqrt(s1^2)*sqrt(s2^2)