使用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)