整体思路是先实现不带括号的加减乘除运算,先乘除,再加减。
通过正则来匹配运算符来找到需要计算的表达式,调用定义的函数进行运算,再需要计算的表达式替换成计算的结果。感觉还是写得不够简洁。
对于有括号的情况,先匹配出括号中的表达式,注意需要使用非贪婪模式进行匹配,避免在多个括号的情况下出错。对匹配到的表达式,调用main()函数进行计算,最后替换掉带有括号的表达式。如此将整个表达式变成不含括号的表达式。
import re
def mul_div(equ):
if '*' in equ:
ret = equ.split('*')
ret = [float(i) for i in ret]
return ret[0] * ret[1]
if '/' in equ:
ret = equ.split('/')
ret = [float(i) for i in ret]
return ret[0] / ret[1]
def add_sub(equ):
if '+' in equ:
ret = equ.split('+')
ret = [float(i) for i in ret]
return ret[0] + ret[1]
if '-' in equ:
ret = equ.split('-')
ret = [float(i) for i in ret]
return ret[0] - ret[1]
def main(equ):
# 四则运算的正则表达式
mul_div_re = re.compile(r'[\d]+\.?[\d]*[*/][\d]+\.?[\d]*')
add_sub_re = re.compile(r'[\d]+\.?[\d]*[+-][\d]+\.?[\d]*')
while re.search(r'[(]', equ): # 处理小括号
brackets_equ = re.search(r'[(](.*?)[)]', equ).group(1)
ret = main(brackets_equ)
equ = re.sub(r'\(.*?\)', ret, equ, count=1)
while re.search(r'[*/]', equ): # 乘除法运算
if mul_div_re.search(equ):
mul_div_equ = mul_div_re.search(equ).group()
ret = mul_div(mul_div_equ)
equ = equ.replace(mul_div_equ, str(ret))
while re.search(r'[+-]', equ): # 加减法运算
if add_sub_re.search(equ):
add_sub_equ = add_sub_re.search(equ).group()
ret = add_sub(add_sub_equ)
equ = equ.replace(add_sub_equ, str(ret))
return equ
if __name__ == '__main__':
equation = input('请输入需要计算的表达式:')
result = main(equation)
print(result)