计算器

import re
#乘除运算
def mult_div(args):
chen_chu = re.compile(r'[\-\+]?(\-?\d+\.?\d*)([\*\/])(\-?\d+\.?\d*)') #取出 [-]x*[-]y 或 [-]x/[-]y
while chen_chu.search(args): #有符合条件的程序就一直执行,直到匹配不到返回None
m = chen_chu.findall(args)
for tup in m:
num1,symbol,num2 = tup
if symbol == '*':
result = float(num1) * float(num2)
elif symbol == '/':
result = float(num1) / float(num2)
args = args.replace(num1+symbol+num2, str(result), 1)
return args

#加减运算
def plus_minu(args):
args = args.replace('++', '+') #将计算过程中出现的不规则运算符替换
args = args.replace('+-', '-')
args = args.replace('-+', '-')
args = args.replace('--', '+')
jia_jian = re.compile(r'(\-?\d+\.?\d*)([\-\+])(\d+\.?\d*)') #查找 [-]x +\- y ,并对数字和运算符号分组
while jia_jian.search(args):
m = jia_jian.search(args)
num = m.group()
num1 = float(m.group(1))
symbol = m.group(2)
num3 = float(m.group(3))

if symbol == '-':
result = num1 - num3
elif symbol == '+':
result = num1 + num3
args = args.replace(num, str(result), 1)
return args

#取括号并进行括号内加减运算
def bracket(value):
kuohao = re.compile(r'\([^()]*\)') #取括号
while kuohao.search(value): #有符合条件的就一直循环,直到返回None时结束
m = kuohao.search(value)
res = m.group()
res_mult = mult_div(res) #括号内乘除法运算
res_mult = res_mult.strip('(').strip(')') #去 两边 ()号
result = plus_minu(res_mult) #加减运算
value = value.replace(res,result,1) #替换
return value

if __name__ == "__main__":
expression = '1-2*((60+2*(-3-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
result=plus_minu(mult_div(bracket(expression)))
print('结果:', round(float(result)))

posted on 2017-10-28 04:05  双手Bible  阅读(111)  评论(0)    收藏  举报

导航