使用Python';s正则表达式在某些字符之间插入符号

使用Python';s正则表达式在某些字符之间插入符号,python,regex,replace,insert,Python,Regex,Replace,Insert,我正在制作一个数学程序,允许用户输入一个方程,程序将解决它。我正在努力使它尽可能的用户友好。我希望用户能够轻松地输入公式,而不必担心在每个乘法实例之间添加乘法符号 以下是一个例子: 用户输入:y=xy+yz程序输出:y=x*y+y*z 我已经能够使用Python的re模块轻松地完成这一点,如下所示: equation = "y=xy+yz" equation = re.sub(r"([xyzuvet])([xyzuvet])",r"\1*\2", equation) # x,y,z,u,v,e

我正在制作一个数学程序,允许用户输入一个方程,程序将解决它。我正在努力使它尽可能的用户友好。我希望用户能够轻松地输入公式,而不必担心在每个乘法实例之间添加乘法符号

以下是一个例子:

用户输入:
y=xy+yz
程序输出:
y=x*y+y*z

我已经能够使用Python的re模块轻松地完成这一点,如下所示:

equation = "y=xy+yz"
equation = re.sub(r"([xyzuvet])([xyzuvet])",r"\1*\2", equation)  # x,y,z,u,v,e, and t and variables and constants the user can use in their equation.
equation = re.sub(r"([xyzuvet])([xyzuvet])",r"\1*\2", equation)  # Must run twice in the event the equation looks something like y=xyzxyz
equation = re.sub(r"([xyzuve]|pi|exp)([xyzuve]|pi|exp)",r"\1*\2", equation)
equation = re.sub(r"([xyzuve]|pi|exp)([xyzuve]|pi|exp)",r"\1*\2", equation)
然而,当我引入一个特殊的函数,如
y=yexp(x)
时,我遇到了一个问题。当我运行上面的代码时,我将得到
y=y*e*xp(x)
的输出

我后来更新了我的代码以说明pi:

equation = re.sub(r"([xyzuve]|pi)([xyzuve]|pi)",r"\1*\2", equation)
equation = re.sub(r"([xyzuve]|pi)([xyzuve]|pi)",r"\1*\2", equation)
我在想,我可以从上面使用类似的方法来匹配
exp
,并防止它在“e”和“x”之间添加
*
,如下所示:

equation = "y=xy+yz"
equation = re.sub(r"([xyzuvet])([xyzuvet])",r"\1*\2", equation)  # x,y,z,u,v,e, and t and variables and constants the user can use in their equation.
equation = re.sub(r"([xyzuvet])([xyzuvet])",r"\1*\2", equation)  # Must run twice in the event the equation looks something like y=xyzxyz
equation = re.sub(r"([xyzuve]|pi|exp)([xyzuve]|pi|exp)",r"\1*\2", equation)
equation = re.sub(r"([xyzuve]|pi|exp)([xyzuve]|pi|exp)",r"\1*\2", equation)
我认为通过添加
exp
,就像我添加
pi
一样,它会起作用;但不幸的是,它不起作用。有没有一种方法可以将exp和其他也包含x、y、z、u、v、t和e的函数作为一个整体来处理

以下是我希望输入看起来像什么的一些示例:

输入:
y=eexp(xyz)
out:
y=e*exp(x*y*z)

输入:
y=pifrexp(yt)
out:
y=pi*frexp(y*t)


In:
y=sin(x)exp(y)
out:
y=sin(x)*exp(y)
您可以使用环视作为

(?<=[xyzuvtf])(?=[xyzuvtf])|(?=exp)|(?<=pi)

(?此基于lookarounds的正则表达式适用于所有测试用例:

(?!^)(?=(?<!fr)(?:fr)?exp|sin|pi|(?<=[xtyzuv]|e(?!xp))[etxyzuv])
(?!^)(?=(?)?

这似乎能满足您的需求:

equation = re.sub(r"([)xyzuvet]|pi|exp|frexp)([xyzuvet]|pi|exp|frexp)\b",r"\1*\2", equation)
equation = re.sub(r"([)xyzuvet]|pi|exp|frexp)([xyzuvet]|pi|exp|frexp)\b",r"\1*\2", equation)
例如:

>>> import re
>>> eqns = ('y=eexp(xyz)', 'y=pifrexp(yt)', 'y=sin(x)exp(y)')
>>> for equation in eqns:
...     equation = re.sub(r"([)xyzuvet]|pi|exp|frexp)([xyzuvet]|pi|exp|frexp)\b",r"\1*\2", equation)
...     equation = re.sub(r"([)xyzuvet]|pi|exp|frexp)([xyzuvet]|pi|exp|frexp)\b",r"\1*\2", equation)
...     print equation
... 
y=e*exp(x*y*z)
y=pi*frexp(y*t)
y=sin(x)*exp(y)

先把
exp
pi
放在第一位。我刚试过,不幸的是同样的问题发生了。因为第二次
re.sub
。它不是在
frexp
中添加了一个
*
吗?这是一个很好的观点。
f
不是我程序中使用的变量,所以它不重要,但是很好的捕获。您的解决方案在直到我尝试类似于
y=eexp(xyzzz)
的东西。我的输出变成
y=e*exp(xyzz*z*z)
.EDIT:如果我多次重复
re.sub
,它会起作用,但不是最好的方法。@anubhava是的,我有过。它缺少
e
,所以
e
和另一个字符之间没有出现
*
。当我将“e”添加回列表时,同样的问题也会发生。因此
pifrexp(yte)
应该变成
pi*frexp(y*t*e)
?当我运行
(?!^)(?=(
pifrexp(yte)
)时,我得到
pi*fre*xp(y*t*e)