# -*- 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*\-\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'\-','+',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()
計算器 (正規表示式
寫個計算器,輸入完全符合要求的 數字組成的表示式,計算相應結果。思路分先後順序遞迴拆解式子。先對 符合進行遞迴,直到全是 表示式,再對 表示式進行遞迴直到只有數字。最後返回計算。include using namespace std define maxn 100005 define maxm 10...
練習 正規表示式計算器
coding utf 8 import re 正規表示式計算器 檢測錯誤 1 括號匹配 2 運算子檢查 3 非法字元 查詢括號,乘除,加減。運算 主函式替換 ret re.findall s 審核小括號 def check k s tag 0 for x in s if x tag 1 elif x...
正規表示式作業 計算器
dic defadd info filename user info with open filename,r encoding utf 8 as f lines f.readlines last line lines 1 id max last line dic id ifid max.isdig...