【正则】——作业计算数学运算

# ### 正则计算器
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) # 219.0

posted on 2020-06-01 17:40  轻轻的我来了呢  阅读(132)  评论(0编辑  收藏  举报