python数学公式识别_python⽤re正则表达式实现数学公式计
python正则表达式不包含算
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:QiFeng Zhang
import re
__Author__ = "Faker"
'''计算表达式字符串'''
bracket = repile(r"\([^()]+\)") #查最内层括号
div = repile(r"(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)") #查除法运算
mul = repile(r"(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)") #查乘法运算
add = repile(r"(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)") #查加法运算
sub = repile(r"(-?\d+\.?\d*--\d+\.?\d*)|(-?\d+\.?\d*-\d+\.?\d*)") #查减法运算
c_f = repile(r"\(?\+?-?\d+\.?\d*\)?") #查括号内是否运算完毕
strip = repile(r"[^(].*[^)]") #去除括号
def Div(s):
'''计算除法'''
exp = re.split(r'/',div.search(s).group()) #将除法表达式拆分成列表
place(div.search(s).group(),str(float(exp[0])/float(exp[1]))) #计算并⽤结果替换列表中表达式
def Mul(s):
'''计算乘法'''
exp = re.split(r'\*',mul.search(s).group()) #将乘法表达式拆分成列表
place(mul.search(s).group(),str(float(exp[0])*float(exp[1]))) #计算并⽤结果替换列表中表达式
def Add(s):
'''计算加法'''
exp = re.split(r'\+',add.search(s).group()) #将加法表达式拆分成列表
place(add.search(s).group(),str(float(exp[0])+float(exp[1]))) #计算并⽤结果替换列表中表达式
def Sub(s):
'''计算减法'''
exp = sub.search(s).group() #去除减法表达式
if exp.startswith('-'): #如果表达式形如:-2.2-1.2;需变换为:-(2.2+1.2)
exp = place('-', '+') #将-号替换为+号;+2.2+1.2
res = Add(exp).replace('+', '-') #调⽤Add运算,将返回值+3.4变为-3.4
else:
exp = re.split(r'-',exp)
res = str(float(exp[0]) - float(exp[1]))
place(sub.search(s).group(),res)
def calc():
while True:
s = input('plase input the key(q for quit)>>>').strip()
if s == 'q': #如果输⼊q退出
break
else:
s = ''.join([x for x in re.split('\s+',s)]) #去除字符串中的空⽩字符
if not s.startswith('('): #若字符串不是以括号开始的,增加括号
s = str('(%s)'%s)
while bracket.search(s): #若表达式存在括号,将括号内容取出来存变量
s = s.replace('--','+') #将表达式中的--替换成+
s_search = bracket.search(s).group() #查最内层括号,将括号内容取出
if div.search(s_search): #如果括号内包含除服,则先算除法
s = s.replace(s_search,Div(s_search)) #替换除法运算
elif mul.search(s_search): #判断是否包含乘法运算
s = s.replace(s_search,Mul(s_search)) #将乘法计算内容替换乘法表达式
elif sub.search(s_search): #判断是否包含减法运算
s = s.replace(s_search,Sub(s_search)) #将减法运算结果替换减法运算表达式
elif add.search(s_search): #判断是否加法运算
s = s.replace(s_search,Add(s_search)) #将加法运算结构调换加法运算表达式
elif c_f.search(s_search): #加减乘除都不含,判断是否有括号
s = s.replace(s_search,strip.search(s_search).group()) #对最终结果执⾏去括号操作print('The answer is %.2f'%(float(s)))
if __name__ == "__main__":
calc()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论