python 利用正則構建乙個計算器

2022-08-19 03:18:13 字數 4653 閱讀 2034

該計算器主要分為四個模組:

weclome_func函式用來進入介面獲取表示式,並判斷表示式是否正確,然後返回表示式;

add_sub函式用來進行加減運算,如果有多個加減運算,會遞迴,最後返回對應的值

multi_divide函式用來進行乘除運算,如果有多個乘除運算,會遞迴,最後返回對應的值

del_bracket函式用來去除小括號及呼叫multi_divide和add_sub函式,如果存在多個括號,也會實現遞迴。

**如下:

#

! /usr/bin/env python3

import

sysimport

redef

welcome_func():

flag_exit =true

welcome_str = "

超級計算器

"print(welcome_str.center(50, "

*"), '\n'

)

while

flag_exit:

exp = input("

請輸入要計算的表示式[q:退出]:

").strip()

if exp == "q"

: flag_exit =false

elif len(exp) ==0:

continue

else

: exp = re.sub("

\s*", '', exp) #

# 取出空格

return

expdef

multi_divide(expression):

val = re.search("

\d+\.?\d*[*/][+-]?\d+\.?\d*

", expression) #

#匹配乘除號,如192.168*-1.99

ifnot val: #

乘除號不存在,返回輸入的表示式

return

expression

data = re.search("

\d+\.?\d*[*/][+-]?\d+\.?\d*

", expression).group()

if len(data.split('

*')) > 1: #

當可以用乘號分割,證明有乘法運算

part1, part2 = data.split('

*') #

用除號分割

value = float(part1) *float(part2)

else

: part1, part2 = data.split('/'

)

if float(part2) == 0: #

如果分母為0,則退出計算

sys.exit("

計算過程中有被除數為0的存在,計算表示式失敗!")

value = float(part1) /float(part2)

s1, s2 = re.split("

\d+\.?\d*[*/][+-]?\d+\.?\d*

", expression, 1) #

分割表示式

next_expression = "

%s%s%s

" %(s1, value, s2)

return multi_divide(next_expression) #

遞迴表示式

defadd_sub(expression):

expression = expression.replace('

+-', '

-') #

替換表示式裡的所有『+-『

expression = expression.replace('

--', '

+') #

替換表示式裡的所有『--『

expression = expression.replace('

-+', '

-') #

替換表示式裡的所有『-+『

expression = expression.replace('

++', '

+') #

替換表示式裡的所有『++『

data = re.search('

\d+\.?\d*[+-]\d+\.?\d*

', expression) #

匹配加減號

ifnot data: #

如果不存在加減號,則證明表示式已計算完成,返回最終結果

return

expression

val = re.search('

[+-]?\d+\.?\d*[+-]\d+\.?\d*

', expression).group()

if len(val.split('

+')) > 1: #

以加號分割成功,有加法計算

part1, part2 = val.split('+'

) value = float(part1) +float(part2)

elif val.startswith('

-'): #

如果是已『-『開頭則需要單獨計算

part1, part2, part3 = val.split('-'

) value = -float(part2) - float(part3) #

計算以負數開頭的減法

else

: part1, part2 = val.split('-'

) value = float(part1) -float(part2)

s1, s2 = re.split('

[+-]?\d+\.?\d*[+-]\d+\.?\d*

', expression, 1) #

分割表示式

next_expression = "

%s%s%s

" %(s1, value, s2)

return add_sub(next_expression) #

遞迴運算表示式

defdel_bracket(expression):

## [^()]+ 匹配除了括號以外的任意字元

ifnot re.search(r"

\([^()]+\)

", expression): #

判斷小括號,如果不存在小括號,直接呼叫乘除,加減計算

ret1 =multi_divide(expression)

ret2 =add_sub(ret1)

return ret2 #

返回最終計算結果

data = re.search(r"

\([^()]+\)

", expression).group() #

如果有小括號,匹配出優先順序最高的小括號

print("

獲取表示式

", data)

data = data.strip('

[\(\)]

') #

剔除小括號

ret1 =multi_divide(data)

#print("全部乘除計算完後的表示式:", ret1)

ret2 =add_sub(ret1)

#print("全部加減計算結果:", ret2)

part1, part2 = re.split(r"

\([^()]+\)

", expression, 1) #

分割表示式

expression = "

%s%s%s

" %(part1, ret2, part2)

return del_bracket(expression) #

遞迴去小括號

if__name__ == "

__main__":

try:

expression = welcome_func() #

# 獲取表示式

print

(expression)

result = eval(expression) #

# 用eval來驗證

print

(result)

ret = del_bracket(expression) #

# 用函式計算得出結果

result =float(result)

ret =float(ret)

print("

eval計算結果:

", result)

print("

表示式計算結果:

", ret)

except

(syntaxerror, valueerror, typeerror):

print("

輸入表示式不合法,請檢查!

")

如何利用Dockerfile檔案構建乙個新映象

dockerfile是由一系列引數和命令組成的指令碼,這些命令和引數應用於基礎映象並最終建立乙個新的映象。開發人員構建好乙個一致的開發環境,測試人員和運維人員就可以直接使用了。隨便找個目錄,新建個檔案,名稱必須為dockerfile 然後輸入 from centos cmd echo hello d...

構建乙個 synchronized

校對 智多芯 定稿 numbbbbb,cmb synchronized在 objective c 中是一種控制結構。它接受乙個物件指標作為引數,後面跟著一段 塊。物件指標充當鎖,在任何時候 synchronized 塊中只允許有乙個執行緒使用該物件指標。這是一種使用鎖進行多執行緒程式設計的簡單方法。...

Python利用random生成乙個列表內的隨機數

首先,需要匯入random模組 importrandom隨機取1 33之間的1個隨機數,可能重複 random.choice range 1,34 print得到一系列隨機數,執行一次得到乙個隨機數 print random.choice range 1,34 隨機取1 33之間的6個隨機數,可能重...