3 python實驗計算機:加減乘除

來源:互聯網
上載者:User

標籤:格式化   false   err   exce   檢查   通過   ace   代碼   string   

#--Time    : 2017/12/31 1:25
#--File : day18計算機作業.py
#__author:"cfp"
#date: 2017/12/30
import re
source=‘1+(2*2)/11+3++(2+-2)+2‘


##判斷子串是否合法
def check_string(source):
flat = True
if re.search(‘[a-zA-Z]‘,source):
print("無效非法字元!")
flat = False
if source.count("(") != source.count(")"):
print("運算式錯誤,括弧未閉合!")
flat = False
return flat

##將子串格式化
def format_string(source):
source = source.replace(" ","")
source = source.replace("++","+")
source = source.replace("-+","-")
source = source.replace("+-","-")
source = source.replace("/+","/")
source = source.replace("*+","*")
return source

##乘除法函數,一次傳入一個()內容
def calc_mul_div(string):
mul_regular = ‘\d+\.?\d*\*\d+\.?\d*‘ ##乘法匹配模式去掉()
div_regular = ‘\d+\.?\d*\/\d+\.?\d*‘ ##乘法匹配模式去掉()

##迴圈進入條件;當()這個字串有*號的時候
while re.findall(‘\*‘,string):

##一次匹配一組args * args 資料
expression = re.search(mul_regular,string).group()

##計算args * args 這組資料
i,v = expression.split(‘*‘)
mul_result = str(float(i)*float(v))

##將計算後的一組args * args 資料;替換掉args * args
string = string.replace(expression,mul_result)

###將子串在進行格式化下
string = string.format(string)

while re.findall(‘\/‘,string) :
expression = re.search(div_regular,string).group()
i,v = expression.split(‘/‘)
div_result = str(float(i)/float(v))
string = string.replace(expression,div_result)
string = string.format(string)
return string

##加減法函數,一次傳入一個()內容
def calc_add_sub(string):
add_sub_regular = ‘\d+\.?\d*\+\d+\.?\d*‘
add_sub1_regular = ‘\d+\.?\d*\-\d+\.?\d*‘
while re.findall(‘\+‘,string):
expression = re.search(add_sub_regular,string).group()
i,v = expression.split(‘+‘)
add_result = str(float(i)+float(v))
string=string.replace(expression,add_result)
string = format_string(string)
while re.findall(‘\-‘,string):
expression1 = re.search(add_sub1_regular, string)
try:
expression1=expression1.group()
except AttributeError:
break
i,v = expression1.split("-")
sub_result = str(float(i)-float(v))
string=string.replace(expression1,sub_result)
string=format_string(string)
return string

##子串通過檢查函數進入if語句
if check_string(source):
print("souece:",source)
source = format_string(source)
print("format:",source)

##列印子串通過eval得到資料用於驗證,代碼的結果是否一致
print(‘eval:‘,eval(source))

##當子串有()的時候進入迴圈,直到沒有()的時候;執行else語句
while re.search(‘\(‘,source):

##匹配最深處的()資料,並傳遞給加減乘除函數,進行解決()資料
strs_regular = ‘\([^()]+\)‘
strs = re.search(strs_regular,source).group()
strs_result = calc_mul_div(strs)
strs_result = calc_add_sub(strs_result)

##將()的兩邊( 和)去掉,只保留內容,並替換掉原來傳入的()
strs_result = strs_result[1:-1]
source=source.replace(strs,strs_result)
source = format_string(source)
else:
strs_result = calc_mul_div(source)
strs_result = calc_add_sub(strs_result)
source=source.replace(source,strs_result)
source = format_string(source)

print("calculator:",source)



3 python實驗計算機:加減乘除

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.