1、實現加減乘除及拓號優先順序解析
2、使用者輸入帶有加減乘除小括號的複雜運算公式後,必須自己解析裡面的(),+,-,*,/符號和公式,運算後得出結果,結果必須與真實的計算器所得出的結果一致
# -*- coding:utf-8 -*-
import re
def check(string): #檢查是否有其他特殊字元字母,檢查表示式合法性
flag=true
if re.findall('[a-z]',string.lower()):
print('表示式錯誤,包含非法字元')
flag=false
if not string.count("(") == string.count(")"):
print("表示式錯誤,括號未閉合")
flag=false
return flag
def format_string(s): #格式化字串 :去掉空格
s=s.replace(' ','')
s=s.replace('--','+')
s=s.replace('++','+')
s=s.replace('+-','-')
s=s.replace('-+','-')
s=s.replace('*+','*')
s=s.replace('/+','/')
return s
def cal_mul_div(string): #計算乘除,如(30+6*2+9/3)
# ret1=re.search('\d+\.?\d*[*/]\d+\.?\d*',s) #匹配小數\d+\.?\d*,匹配乘或除[*/]
regular='\d+\.?\d*([*/]|\*\*)[\-]?\d+\.?\d*'
while re.search(regular,string):
expression = re.search(regular,string).group() #獲取表示式6*2
if expression.count("*")==1: #如果是乘法
x,y = expression.split("*") #獲取要計算的2個數
mul_result = str(float(x) * float(y))
string = string.replace(expression,mul_result) #將計算的表示式替換為計算結果值
string = format_string(string) #格式化
if expression.count("/"): #如果是除法
x,y = expression.split("/")
div_result = str(float(x) / float(y))
string = string.replace(expression,div_result)
string = format_string(string)
if expression.count("*")==2: #如果是乘方
x,y=expression.split('**')
pow_result=1
for i in range(int(y)):
pow_result*=int(x)
string=string.replace(expression,str(pow_result))
string=format_string(string)
return string
def cal_add_sub(string): #計算加減
# ret1 = re.search('\d+\.?\d*[+-]\d+\.?\d*', s) # 匹配小數\d+\.?\d*,匹配加或減[+-]
add_regular='[\-]?\d+\.?\d*\+[\-]?\d+\.?\d*'
sub_regular='[\-]?\d+\.?\d*\-[\-]?\d+\.?\d*'
while re.findall(add_regular,string): #加法
add_list = re.findall(add_regular,string)
for add_str in add_list:
x,y = add_str.split("+")
add_result = "+" + str(float(x) + float(y))
string = string.replace(add_str, add_result)
string = format_string(string)
while re.findall(sub_regular,string): #減法
sub_list = re.findall(sub_regular,string)
for sub_str in sub_list:
numbers = sub_str.split("-")
if len(numbers) == 3:
result = 0
for v in numbers:
if v:
result -= float(v)
else:
x,y = numbers
result = float(x) - float(y)
return string
if __name__ == "__main__":
# source = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
source = '1-2*3+9/3-(1+1+(2-1)*1)'
if check(source):
print("source:",source)
print("eval result:",eval(source))
source=format_string(source)
print(source)
# while re.search('\('):
while source.count('(') > 0:
strs=re.search('\([^()]+\)',source).group() #找到最裡面的()
repalce_str=cal_mul_div(strs) #將括號裡面的表示式進行乘除運算(2+15)
replace_str=cal_add_sub(repalce_str) #將括號裡面的表示式進行加減運算 '(17)'
source=format_string(source.replace(strs,repalce_str[1:-1])) #將括號的字串替換為計算結果,結果包含(),替換時去掉():[1:-1]
else: #沒有括號就到最後單一表示式了
strs = cal_mul_div(strs) # 算乘除
strs = cal_add_sub(strs) # 算加減
source = source.replace(source,replace_str)
print("my result:",source.replace("+",""))
Python 練習 計算器
import re def format string s 對表示式進行格式化 s s.replace s s.replace s s.replace s s.replace s s.replace s s.replace return s def check expression s 對表示式進行...
Python正則表達計算器
計算器 author ryoma time 17 39 import re def add string equ string flag true while flag is right re.search d d d d equ if is right old is right.group 計算加...
python正則實現計算器功能
coding utf 8 author gogh time 2017 12 4 20 16 email 361910002 qq.com import re def operator update formula 對formula公式進行 去除空字元,更新運算子處理 formula formula....