# -*- coding: utf-8 -*-import re#本內容借鑒了別人的compile用法,我覺得這個用起來,代碼比較簡潔,明瞭bk = re.compile(r'\([^()]+\)') # 尋找最內層括弧規則mul = re.compile(r'(\d+\.?\d*\*-\d+\.? ...
# -*- coding: utf-8 -*-
import re
#本內容借鑒了別人的compile用法,我覺得這個用起來,代碼比較簡潔,明瞭
bk = re.compile(r'\([^()]+\)') # 尋找最內層括弧規則
mul = re.compile(r'(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)') # 尋找乘法運算規則
div = re.compile(r'(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)') # 尋找除法運算規則
add = re.compile(r'(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)') # 尋找加法運算規則
subt = re.compile(r'(-?\d+\.?\d*\-{2}\d+\.?\d*)|(-?\d+\.?\d*\-\d+\.?\d*)') # 尋找減法運算規則
remove = re.compile(r'[^(].*[^)]') # 脫括弧規則
def cal_mul(s):
'''計算表達式中的乘法'''
sp = re.split(r'\*',mul.search(s).group())
result = str(float(sp[0]) * float(sp[1]))
return result
def cal_div(s):
'''計算表達式中的除法'''
sp = re.split(r'\/',div.search(s).group())
result = str(float(sp[0]) / float(sp[1]))
return result
def cal_add(s):
'''計算表達式中的加法'''
sp = re.split(r'\+',add.search(s).group())
result = re.sub(add,str(float(sp[0]) + float(sp[1])),s,count=1)
return result
def cal_subt(s):
'''計算表達式中的減法'''
sp = subt.search(s).group()
if sp.startswith('-'): #如果表達式是以-開頭 -1-1
s1 = re.sub(r'\-','+',sp) #將-替換成+ +1+1
s2 = cal_add(s1) #調用加法 +2
s3 = re.sub(r'\++','-',s2) #將結果替換成- -2
result = re.sub(subt,s3,s,count=1)
else:
s1 = re.split(r'\-',sp)
result = re.sub(subt,str(float(s1[0]) - float(s1[1])),s,count=1)
return result
def main():
while True:
s = input("請輸入計算公式(q退出) >>>>")
if s == "q":
exit()
else:
s = "".join([i for i in re.split('\s+',s)]) #將輸入的表達式中空格去掉
if not s.startswith('(') or not s.endswith(')'): #判斷輸入是否在括弧內
s = "(%s)"%s # 1+2 -->(1+2)
while bk.search(s): #判斷s中是否有內層括弧
s = re.sub(r'\-{2}','+',s) #如果表達式中含有-- --> + 例如:--2 --> +2
s1 = bk.search(s).group() #找到最記憶體括弧
if div.search(s1): #判斷s1中是否有除法
s2 = div.search(s1).group() #獲得除法的表達式
s3 = s1.replace(s2,cal_div(s2)) #字元串替換
if re.search(r'\(\+?\-?\d+\.?\d*\)',s3): #判斷s3是否為括弧內的值 例如:(3)
s3 = remove.search(s3).group() #將值的括弧去掉 (3) --> 3
s = s.replace(s1,s3) #將s中的s1替換為s3
elif mul.search(s1): #判斷表達式中是否有乘法
s2 = mul.search(s1).group()
s3 = s1.replace(s2,cal_mul(s2))
if re.search(r'\(\+?\-?\d+\.?\d*\)',s3):
s3 = remove.search(s3).group()
s = s.replace(s1,s3)
elif subt.search(s1): #判斷表達式中是否有減法
s2 = subt.search(s1).group()
s3 = s1.replace(s2,cal_subt(s2))
if re.search(r'\(\+?\-?\d+\.?\d*\)',s3):
s3 = remove.search(s3).group()
s = s.replace(s1,s3)
elif add.search(s1): #判斷表達式中是否有加法
s2 = add.search(s1).group()
s3 = s1.replace(s2, cal_add(s2))
if re.search(r'\(\+?\-?\d+\.?\d*\)',s3):
s3 = remove.search(s3).group()
s = s.replace(s1,s3)
print("計算結果是:%s"%s)
if __name__ == '__main__':
main()