代碼感覺有點繞,剛開始學習python,相關知識點還沒全部學習到,還請各位大神多多指教
import re # 定義乘法 def mul(string): mul1 = re.search('-?\d+(?:\.\d+)?\*-?\d+(?:\.\d+)?', string) str1 = mul1.group() li = re.split('\*', str1) mul_ret = float(li[0]) * float(li[1]) if mul_ret < 0: return string.replace(string[mul1.start(): mul1.end()], str(mul_ret)) else: return string.replace(string[mul1.start(): mul1.end()], '+' + str(mul_ret)) # 定義除法 def div(string): div1 = re.search('-?\d+(?:\.\d+)?/-?\d+(?:\.\d+)?', string) str1 = div1.group() li = re.split('/', str1) div_ret = float(li[0]) / float(li[1]) if div_ret < 0: return string.replace(string[div1.start(): div1.end()], str(div_ret)) else: return string.replace(string[div1.start(): div1.end()], '+' + str(div_ret)) # 定義加法 def add(string): add1 = re.search('-?\d+(?:\.\d+)?\+-?\d+(?:\.\d+)?', string) str1 = add1.group() li = re.split('\+', str1) add_ret = float(li[0]) + float(li[1]) return string.replace(string[add1.start(): add1.end()], str(add_ret)) # 定義減法 def sub(string): sub1 = re.search('-?\d+(?:\.\d+)?--?\d+(?:\.\d+)?', string) str1 = sub1.group() if str1[0] == '-': str1 = str1[1:] li = re.split('-', str1, 1) sub_ret = 0 - float(li[0]) - float(li[1]) return string.replace(string[sub1.start(): sub1.end()], str(sub_ret)) else: li = re.split('-', str1, 1) sub_ret = float(li[0]) - float(li[1]) return string.replace(string[sub1.start(): sub1.end()], str(sub_ret)) # 去除括號 def brackets(string): string = re.sub(r' ', '', string) n = string.count('(') while n: n -= 1 m1 = re.search('(?<=\()[^\(\)]*(?=\))', string) str1 = m1.group() str1_ret = cal(str1) string = string.replace(string[m1.start() - 1: m1.end() + 1], str(str1_ret)) return string # 定義不含括號的運算
def cal(string):
li1 = re.findall('\*|/', string)
for i in li1:
if i == '*':
string = mul(string)
elif i == '/':
string = div(string)
if string[0] == '-' or '+':
string = '0' + string
li2 = re.findall('\+|-', string)
n = len(li2)
while n:
string = string.replace('+-', '-')
string = string.replace('--', '+')
string = string.replace('-+', '-')
string = string.replace('++', '+')
n -= 1
li3 = re.findall('\+|-', string)
for i in li3:
if i == '+':
string = add(string)
elif i == '-':
string = sub(string)
return string
def jm_cal(string):
cal_ret = cal(brackets(string))
return cal_ret
輸入:
s = '-45 + 15 * (12 - 68 / (11 - 5 * 2 + (-9 )/ 4)* 6) / 4 + 6 - (14 / 9 + 8 * (-7) - 6 * 2 + 13) * 12'
print(jm_cal(s))
輸出:
1871.3333333333333
與直接調用eval()內置函數計算結果一致