正規表示式之實戰 計算器

2022-09-01 10:42:10 字數 3452 閱讀 2870

# -*- 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...