python正则实现计算器功能
本文实例为大家分享了python正则实现计算器功能的具体代码,供大家参考,具体内容如下
#-*-coding:utf-8-*-
#Author:Gogh
#@Time:2017/12/420:16
#@Email:361910002@qq.com
importre
defoperator_update(formula):
#对formula公式进行去除空字符,更新运算符处理
formula=formula.replace("","")#去除空字符
formula=formula.replace("+-","-")
formula=formula.replace("--","+")
returnformula
defcalc_muldiv(formula_list):
'''''
计算公式里面的乘除
:paramformula:列表
:return:
'''
forindex,elementinenumerate(formula_list):
if"*"inelementor"/"inelement:
operators=re.findall("[*/]",element)
calc_list=re.split("[*/]",element)
num=None
fori,einenumerate(calc_list):
ifnum:
ifoperators[i-1]=="*":
num*=float(e)
elifoperators[i-1]=="/":
num/=float(e)
else:
num=float(e)
formula_list[index]=num
returnformula_list
defcalc_plumin(operators,num_list):
'''''
计算列表数字的加减
:paramoperators:运算符列表
:paramnum_list:进行运算的数字列表
:return:返回计算结果
'''
num=None
fori,einenumerate(num_list):
ifnum:
ifoperators[i-1]=="+":
num+=float(e)
elifoperators[i-1]=="-":
num-=float(e)
else:
num=float(e)
returnnum
defmerge(plus_minus_operator,multiply_divide_list):
'''''
把列表中这样的形式'2*''-3*''5/3*''4/2'合并到一块
:paramformula_list:
:return:
'''
forindex,elementinenumerate(multiply_divide_list):
ifelement.endswith("*")orelement.endswith("/"):
multiply_divide_list[index]=element+plus_minus_operator[index]+multiply_divide_list[index+1]
delmultiply_divide_list[index+1]
delplus_minus_operator[index]
returnmerge(plus_minus_operator,multiply_divide_list)
returnplus_minus_operator,multiply_divide_list
defbracket_calc(formula):
'''''
对括号最内层的formula公式进行计算
:paramformula:
:return:
'''
formula=re.sub("[()]","",formula)#去除两边的()
formula=operator_update(formula)
plus_minus_operator=re.findall("[+-]",formula)#列表'+''-'运算符
multiply_divide_list=re.split("[+-]",formula)#列表有'*''/'
ifmultiply_divide_list[0]=="":#multiply_divide_list列表第一个字符为空的话,表示一个数字为负号
multiply_divide_list[1]="-"+multiply_divide_list[1]
delplus_minus_operator[0]
delmultiply_divide_list[0]
res=merge(plus_minus_operator,multiply_divide_list)
plus_minus_operator=res[0]#列表'+''-'运算符进行合并处理
multiply_divide_list=res[1]
plus_minus_list=calc_muldiv(multiply_divide_list)#生成只进行加减运算的列表
res=calc_plumin(plus_minus_operator,plus_minus_list)
returnres
defcalculate(formula):
'''''计算程序主入口,主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减'''
whileTrue:
formula_depth=re.search("[()]+",formula)
ifformula_depth:
formula_depth=formula_depth.group()
res=bracket_calc(formula_depth)
formula=formula.replace(formula_depth,str(res))
print("\33[34;1m%s\33[0m"%(formula))
else:
res=bracket_calc(formula)
print("\33[31;1m结果:%s\33[0m"%(res))
exit()
if__name__=='__main__':
formula="1-2*((60-30+(-9-2-5-2*-3-5/3-40*4/2-3/5+6*3)*(-9-2-5-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"
calculate(formula)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。