正则计算器---day19

计算下面表达式最后的结果
strvar = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"

#
### 正则计算器 import re strvar = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))" # 2776672.6952380957 # strvar = "-30+(40+5*-2+3/2)*8 + (4- 7) " print(eval(strvar)) # 2776672.6952380957 # 处理符号 def sign_exp(strvar): strvar = strvar.replace("+-","-") strvar = strvar.replace("--","+") strvar = strvar.replace("-+","-") strvar = strvar.replace("++","+") return strvar # 计算表达式 def calc_exp(strvar): # 判断字符串是 乘法 还是 除法 if "*" in strvar: a,b = strvar.split("*") return float(a) * float(b) if "/" in strvar: a,b = strvar.split("/") return float(a) / float(b) # 操作表达式 def opreate_exp(strvar): # 先算乘除 while True: # (40+5*-2+3/2) # 匹配 [谁*谁] 或者 [谁/谁] 例: 5*-2 3/2 obj = re.search(r"d+(.d+)?[*/][+-]?d+(.d+)?",strvar) if obj: res1 = obj.group() # print(res1) # 5*-2 # 计算表达式的结果 res2 = calc_exp(res1) # print(res2 , type(res2)) # -10.0 <class 'float'> # 将所得的结果,替换到原来的字符串当中,以匹配下一个乘法或者除法 strvar = strvar.replace(res1,str(res2)) # print(strvar) # (40+-10.0+3/2) else: # 当obj 返回None的时候停止 break # 处理表达式中的符号 strvar = sign_exp(strvar) # print(strvar) # (40+-10.0+1.5) (40-10.0+1.5) # 计算剩下+-的表达式(将每一个数字匹配出来,做累加) lst = re.findall("[+-]?d+(?:.d+)?",strvar) # print(lst) # ['40', '-10.0', '+1.5'] total = 0 for i in lst: total += float(i) # print(total) # 31.5 return total # 移除括号 def remove_bracket(strvar): while True: obj = re.search("([^()]+)",strvar) # print(obj) if obj: res1 = obj.group() # print(res1) # (40+5*-2+3/2) "-30+(40+5*-2+3/2)*8 +(4-7)" # 计算一个括号里面表达式的值 res2 = opreate_exp(res1) # print(res2) # 31.5 # 替换原来的括号,消除括号 strvar = strvar.replace(res1,str(res2)) # print(strvar) # -30+31.5*8+(4-7) else: return strvar # 返回一串没有括号的表达式 # main函数当中不写逻辑,只调用相关的功能 def main(strvar): # 1.整理数据,把没用的空格去掉 strvar = strvar.replace(" ","") # 2.移除所有括号 strvar = remove_bracket(strvar) # print(strvar) # -30+31.5*8+-3.0 # 3.计算表达式 return opreate_exp(strvar) res = main(strvar) print(res)
原文地址:https://www.cnblogs.com/weiweivip666/p/12957828.html