溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python字符串四則運算式編碼解題分析

發(fā)布時間:2021-11-25 11:15:01 來源:億速云 閱讀:184 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“python字符串四則運算式編碼解題分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

首先循環(huán)查找最內(nèi)層括號,對其中的運算式求解,然后將結(jié)果替換掉字符串中對應的運算式。循環(huán)求解直到整個運算式所有括號均被解。

對不含括號的運算式求解時從左到右,先循環(huán)解出所有除法,再循環(huán)解出所有乘法,再做加減法。

解括號

首先看題目案例:

'10-3*(20-10+(-10/5)*27/3/3-(-100)/(10-3*5))+(-2.5*-12)'

首先要提取內(nèi)層括號內(nèi)的所有字符,編寫正則表達式如下:

'\(([^()]+?)\)'

# \(和\)是為了匹配左括號和右括號,注意左右括號在正則表達式表示分組的意思,所以要加\轉(zhuǎn)義成原本括號的意思。
# [^()]字符組內(nèi)^表示非,^()表示匹配不含括號的內(nèi)容
# +?表示匹配內(nèi)容為1個或多個,最小匹配模式
# ([^()]+?)表示對不含括號的內(nèi)容作為分組提取

編寫解括號的代碼:

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函數(shù)用來計算不含括號的加減乘除運算式s = s.replace('--', '+')  # 注意一:處理解括號后可能出現(xiàn)減負號的情況else:s = count(s)return s

解乘除

這里是計算不含括號的加減乘除運算式,首先要做除法,那么先要提取除法運算式左右兩邊的數(shù)字,編寫正則表達式如下:

([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+)

# [-]?表示可能存在負號
# \d+\.\d+表示匹配浮點數(shù)
# [-]?\d+表示匹配整數(shù)
# ([-]?\d+\.\d+|[-]?\d+)表示提取正負浮點數(shù)或正負整數(shù)
# ([-]?\d+\.\d+|[-]?\d+)/([-]?\d+\.\d+|[-]?\d+) 表示提取/兩邊的正負浮點數(shù)或正負整數(shù)

循環(huán)運算除法過程:

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])}')

循環(huán)運算乘法過程(乘法的正則和除法的正則只差一個運算符):

    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:  # 注意二:負數(shù)乘負數(shù)得正數(shù)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])}')

解加減法

解加減法的感覺是最簡單的一步,只要按上面的正則匹配出正負浮點數(shù)或正負整數(shù),然后對所有數(shù)值累加即可。

    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

注意事項

注意一:處理解括號后可能出現(xiàn)減負號的情況。

注意二:負數(shù)乘負數(shù)得正數(shù)。

上述兩條注意事項在編碼時并未考慮到,后來運行程序發(fā)現(xiàn)結(jié)果不對,調(diào)試了很久才發(fā)現(xiàn)上述2個注意事項被忽略了,最后加上了2行代碼后運算結(jié)果正確無誤。

基本四則運算已經(jīng)都非常熟悉了,但編碼過程中還是會有疏漏。這在編寫項目時經(jīng)常會發(fā)生類似情況。程序員和需求方溝通時經(jīng)常會發(fā)生類似情況,需求方經(jīng)常因為有些是常識性的細節(jié)忘了提及,而程序員不精通業(yè)務需求方的業(yè)務,此時在需求方未提及的細節(jié)程序員也未考慮周全就會產(chǎn)生疏漏和bug。

所以加強溝通非常重要,程序員考慮需求全面且細致非常重要。

“python字符串四則運算式編碼解題分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI