# c=a if 成立就用c=a表達式 else b , 不成立c=b
import re
s_input="1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
def Judging_Conformity(x):#判斷式子里面是否只有數字和*/+-()空格或者有**、//、+*、*.、等錯誤形式
flag=True
if re.findall("[^*/+\-() \d]|[*/+\-.]+[*/+\-.]+|\([*/+]+|\.\d*\.",x):
flag=False
return flag
def format_replace(x):#格式化去掉空格
x=x.replace(" ","")
return add_sub(remove_md(x))
def add_sub(x):
x=re.sub("\+-|-\+","-",x)
x=re.sub("--|\+\+","+",x)
if not re.findall("[\d]+[+\-][\d]+",x):
if x[0]=="+":#去掉最后在數字前面的+
x=x[1:]
return x
else:
k=re.search("-?[\d.]+[+-][\d.]+",x).group()
k3=k
if x[0]=="-":#如果開頭有-號
k=k[1:]
k2=float("-"+k.split("+")[0])+float(k.split("+")[1]) if "+" in k else float("-"+k.split("-")[0])+float(k.split("-")[1])
else:
k2=float(k.split("+")[0])+float(k.split("+")[1]) if "+" in k else float(k.split("-")[0]) - float(k.split("-")[1])
x=x.replace(k3,str(k2))
return add_sub(x)
def Multiplication_division(x):#乘除法
ret=float(x.split("*")[0])*float(x.split("*")[1]) if "*" in x else float(x.split("/")[0])/float(x.split("/")[1])
return ret
def remove_md(x):
if not re.findall("[*/]",x):
return x
else:
k=re.search("-?[\d.]+[*/]-?[\d.]+",x).group()
x=x.replace(k,"+"+ str(Multiplication_division(k))) if len(re.findall("-",k))==2 else x.replace(k,str(Multiplication_division(k)))
return remove_md(x)
def bin_Calculator(x):#啟動計算器
if not re.search("\(.*\)",x):#如果沒發現括號直接執行格式化然后加減乘除
return format_replace(x)
k=re.search("\([^()]+\)",x).group()
x=x.replace(k,str(format_replace(k[1:len(k)-1])))
return bin_Calculator(x)
def star_calculator(x):
x=x.replace(" ","")#去掉空格
if Judging_Conformity(x):#看是否符合輸入標准.
return bin_Calculator(x)
else:
print("輸入格式錯誤!")
print("原式子:{}\n正確答案:{}\n計算答案:{}".format(s_input,eval(s_input),star_calculator(s_input)))