正则小程序:
给你字符串 '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))' 计算最后结果.
提示:"-30+(40+5*-2+3/2)*8+ (4- 7) "
计算铺垫
# ### 计算器
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))'
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 sign_exp(strvar):
strvar = strvar.replace("+-","-")
strvar = strvar.replace("--","+")
strvar = strvar.replace("++","+")
strvar = strvar.replace("-+","-")
return strvar
# "-30+(40+5*-2+3/2)*8+ (4- 7) "
strvar = "-30+(40+5*-2+3/2)*8+ (4- 7) "
strvar = strvar.replace(" ","")
print(strvar) # -30+(40+5*-2+3/2)*8+(4-7)
# 第一步 通过正则匹配最里层的小括号
obj = re.search(r"\([^()]+\)",strvar)
if obj:
# 第二部:拿取数据
res1 = obj.group()
print(res1) # (40+5*-2+3/2)
# 第三部:匹配出乘除表达式 谁*谁 谁/谁
# obj = re.search(r"\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?" , strvar)
obj = re.search(r"\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?" , res1)
res2 = obj.group()
print(res2) # 5 * -2
# 第四部:计算出结果
res3 = str(calc_exp(res2))
print(res3) # -10.0
# 第五步:把结果替换回原来的字符串
res4 = res1.replace(res2,res3)
print(res4) # (40+-10.0+3/2)
# 第六部:合并多余的符号
res5 = sign_exp(res4)
print(res5)
# 重复3 4 5 6 步奏 依次类推 ... 把所有的乘除计算完毕
"""
当算完乘除之后,再去把括号里面的加减算完,得出最后的结果
再去替换原来的那个括号整体
依次类推,直到得出最后的结果...
"""
正式计算:
# ### 计算器
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))'
# 计算乘除
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 sign_exp(strvar):
strvar = strvar.replace("+-","-")
strvar = strvar.replace("--","+")
strvar = strvar.replace("++","+")
strvar = strvar.replace("-+","-")
return strvar
# 计算表达式
def operate_exp(strvar):
while True:
obj = re.search(r"\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?" , strvar)
if obj:
res1 = obj.group()
print(res1,"<==1==>") # 5*-2
# 计算乘除后的结果
res2 = calc_exp(res1)
print(res2,"<==2==>") # -10.0
# 用结果替换原来的表达式
strvar = strvar.replace(res1,str(res2))
print(strvar) # (40+-10.0+3/2)
else:
break
# 合并符号
strvar = sign_exp(strvar)
print(strvar,"<==3==>") # (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)
# 返回最后的结果
return total
# 去除小括号
def remove_bracket(strvar):
while True:
obj = re.search(r"\([^()]+\)",strvar)
if obj:
# 拿取数据
res1 = obj.group()
print(res1,"<===>") # (40+5*-2+3/2)
res2 = operate_exp(res1)
print(res2,type(res2)) # 31.5 float
# 替换原来的括号
strvar = strvar.replace(res1,str(res2))
else:
# 返回最后的字符串
return strvar
# 主函数调用
def main(strvar):
# 去除原字符串所有的空格
strvar = strvar.replace(" ","")
# 去除所有的括号
strvar = remove_bracket(strvar)
# print(strvar , "<===!!!==>") # -30+31.5*8+-3.0 <===!!!==>
# 计算最后的表达式
return operate_exp(strvar)
# strvar = "-30+(40+5*-2+3/2)*8+ (4- 7) "
res = main(strvar)
print(res) # 2776672.6952380957
print(eval(strvar))