python用re正則表達式實現數學公式計算


#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:QiFeng Zhang
import re
__Author__ = "Faker"

'''計算表達式字符串'''
bracket = re.compile(r"\([^()]+\)") #查找最內層括號
div = re.compile(r"(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)") #查找除法運算
mul = re.compile(r"(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)") #查找乘法運算
add = re.compile(r"(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)") #查找加法運算
sub = re.compile(r"(-?\d+\.?\d*--\d+\.?\d*)|(-?\d+\.?\d*-\d+\.?\d*)") #查找減法運算
c_f = re.compile(r"\(?\+?-?\d+\.?\d*\)?") #查找括號內是否運算完畢
strip = re.compile(r"[^(].*[^)]") #去除括號

def Div(s):
'''計算除法'''
exp = re.split(r'/',div.search(s).group()) #將除法表達式拆分成列表
return s.replace(div.search(s).group(),str(float(exp[0])/float(exp[1]))) #計算並用結果替換列表中表達式
def Mul(s):
'''計算乘法'''
exp = re.split(r'\*',mul.search(s).group()) #將乘法表達式拆分成列表
return s.replace(mul.search(s).group(),str(float(exp[0])*float(exp[1]))) #計算並用結果替換列表中表達式
def Add(s):
'''計算加法'''
exp = re.split(r'\+',add.search(s).group()) #將加法表達式拆分成列表
return s.replace(add.search(s).group(),str(float(exp[0])+float(exp[1]))) #計算並用結果替換列表中表達式
def Sub(s):
'''計算減法'''
exp = sub.search(s).group() #去除減法表達式
if exp.startswith('-'): #如果表達式形如:-2.2-1.2;需變換為:-(2.2+1.2)
exp = exp.replace('-', '+') #將-號替換為+號;+2.2+1.2
res = Add(exp).replace('+', '-') #調用Add運算,將返回值+3.4變為-3.4
else:
exp = re.split(r'-',exp)
res = str(float(exp[0]) - float(exp[1]))
return s.replace(sub.search(s).group(),res)

def calc():
while True:
s = input('plase input the key(q for quit)>>>').strip()
if s == 'q': #如果輸入q退出
break
else:
s = ''.join([x for x in re.split('\s+',s)]) #去除字符串中的空白字符
if not s.startswith('('): #若字符串不是以括號開始的,增加括號
s = str('(%s)'%s)
while bracket.search(s): #若表達式存在括號,將括號內容取出來存變量
s = s.replace('--','+') #將表達式中的--替換成+
s_search = bracket.search(s).group() #查找最內層括號,將括號內容取出
if div.search(s_search): #如果括號內包含除服,則先算除法
s = s.replace(s_search,Div(s_search)) #替換除法運算
elif mul.search(s_search): #判斷是否包含乘法運算
s = s.replace(s_search,Mul(s_search)) #將乘法計算內容替換乘法表達式
elif sub.search(s_search): #判斷是否包含減法運算
s = s.replace(s_search,Sub(s_search)) #將減法運算結果替換減法運算表達式
elif add.search(s_search): #判斷是否加法運算
s = s.replace(s_search,Add(s_search)) #將加法運算結構調換加法運算表達式
elif c_f.search(s_search): #加減乘除都不含,判斷是否有括號
s = s.replace(s_search,strip.search(s_search).group()) #對最終結果執行去括號操作

print('The answer is %.2f'%(float(s)))


if __name__ == "__main__":
calc()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM