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

时间:2015-09-25 06:36:41

标签: python regex replace insert

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

以下是一个例子:

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

我已经能够使用Python的模块轻松完成这项工作,如下所示:

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

但是当我引入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 = 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)出:y=e*exp(x*y*z)

在:y=pifrexp(yt)出:y=pi*frexp(y*t)

在:y=sin(x)exp(y)出:y=sin(x)*exp(y)

3 个答案:

答案 0 :(得分:1)

你可以使用环顾四周来作为

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

Regex Demo

答案 1 :(得分:1)

这个基于外观的正则表达式适用于所有测试用例:

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

RegEx Demo

答案 2 :(得分:1)

这似乎产生了你想要的东西:

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)