您好,登錄后才能下訂單哦!
本篇內容介紹了“python字符串四則運算式編碼解題分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
首先循環查找最內層括號,對其中的運算式求解,然后將結果替換掉字符串中對應的運算式。循環求解直到整個運算式所有括號均被解。
對不含括號的運算式求解時從左到右,先循環解出所有除法,再循環解出所有乘法,再做加減法。
首先看題目案例:
'10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-2.5*-12)'
首先要提取內層括號內的所有字符,編寫正則表達式如下:
'\(([^()]+?)\)' # \(和\)是為了匹配左括號和右括號,注意左右括號在正則表達式表示分組的意思,所以要加\轉義成原本括號的意思。 # [^()]字符組內^表示非,^()表示匹配不含括號的內容 # +?表示匹配內容為1個或多個,最小匹配模式 # ([^()]+?)表示對不含括號的內容作為分組提取
編寫解括號的代碼:
def cal(s):s = s.replace(' ', '') # 去除字符串中所有空格,防止匹配出錯while '(' in s or ')' in s:ret = re.findall('\(([^()]+?)\)', s)for i in ret:s = s.replace(f'({i})', count(i)) # count函數用來計算不含括號的加減乘除運算式s = s.replace('--', '+') # 注意一:處理解括號后可能出現減負號的情況else:s = count(s)return s
這里是計算不含括號的加減乘除運算式,首先要做除法,那么先要提取除法運算式左右兩邊的數字,編寫正則表達式如下:
([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+) # [-]?表示可能存在負號 # \d+\.\d+表示匹配浮點數 # [-]?\d+表示匹配整數 # ([-]?\d+\.\d+|[-]?\d+)表示提取正負浮點數或正負整數 # ([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+) 表示提取/兩邊的正負浮點數或正負整數
循環運算除法過程:
def count(s):while '/' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+)', s)for i in result:s = s.replace(f'{i[0]}/{i[1]}', f'{float(i[0]) / float(i[1])}')
循環運算乘法過程(乘法的正則和除法的正則只差一個運算符):
while '*' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)\*([-]?\d+\.\d+|[-]?\d+)', s)for i in result:if float(i[0]) < 0 and float(i[1]) < 0: # 注意二:負數乘負數得正數s = s.replace(f'{i[0]}*{i[1]}', f'+{float(i[0]) * float(i[1])}')else:s = s.replace(f'{i[0]}*{i[1]}', f'{float(i[0]) * float(i[1])}')
解加減法的感覺是最簡單的一步,只要按上面的正則匹配出正負浮點數或正負整數,然后對所有數值累加即可。
result = re.findall('([-]?\d+\.\d+|[-]?\d+)', s)x = 0for i in result:x += float(i)s = str(x)return s
import redef count(s):while '/' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+)', s)for i in result:s = s.replace(f'{i[0]}/{i[1]}', f'{float(i[0]) / float(i[1])}')while '*' in s:result = re.findall('([-]?\d+\.\d+|[-]?\d+)\*([-]?\d+\.\d+|[-]?\d+)', s)for i in result:if float(i[0]) < 0 and float(i[1]) < 0:s = s.replace(f'{i[0]}*{i[1]}', f'+{float(i[0]) * float(i[1])}')else:s = s.replace(f'{i[0]}*{i[1]}', f'{float(i[0]) * float(i[1])}')result = re.findall('([-]?\d+\.\d+|[-]?\d+)', s)x = 0for i in result:x += float(i)s = str(x)return sdef cal(s):s = s.replace(' ', '')while '(' in s or ')' in s:ret = re.findall('\(([^()]+?)\)', s)for i in ret:s = s.replace(f'({i})', count(i))s = s.replace('--', '+')else:s = count(s)return sprint(cal('10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))'))print(cal('10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-2.5*-12)'))print(cal('10 - 3 * ( (50-30 +(-10/5) * (9-2*5/3 + 7 /3*99/4*2020 +10 * 789/15 )) - (-4*3)/ (16-3*2) )'))out:58.088.0703066.4000000001
注意一:處理解括號后可能出現減負號的情況。
注意二:負數乘負數得正數。
上述兩條注意事項在編碼時并未考慮到,后來運行程序發現結果不對,調試了很久才發現上述2個注意事項被忽略了,最后加上了2行代碼后運算結果正確無誤。
基本四則運算已經都非常熟悉了,但編碼過程中還是會有疏漏。這在編寫項目時經常會發生類似情況。程序員和需求方溝通時經常會發生類似情況,需求方經常因為有些是常識性的細節忘了提及,而程序員不精通業務需求方的業務,此時在需求方未提及的細節程序員也未考慮周全就會產生疏漏和bug。
所以加強溝通非常重要,程序員考慮需求全面且細致非常重要。
“python字符串四則運算式編碼解題分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。