脱产班第三次大作业-计算器(正则表达式)

要求

  • 实现能计算类似
  • 基础功能 加减乘除 a+b
  • 进阶功能 a+b*c
  • 更难的 带括号的
  • 不许使用eval
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))

提示

  1. 正则表达式
  2. 先匹配 ()
  3. 先匹配 * /
  4. 再匹配 + -
1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
从上面算式中匹配出最内层小括号以及小括号内的表达式
\([^()]+\)

从类似9-2*5/3+7/3*99/4*2998+10*568/14的表达式中匹配出乘法或除法
\d+(\.\d+)?[*/]\d+(\.\d+)?

LowVer.

#!/usr/bin/env python
# encoding: utf-8
import re
def Mult_Divide(comput):
    if '*' in comput:x,y = comput.split('*');return str(float(x) * float(y))
    elif '/' in comput:x,y = comput.split('/');return str(float(x) / float(y))
def format_exp(exp):
    exp = exp.replace('--','+');exp = exp.replace('+-','-')
    exp = exp.replace('-+','-');exp = exp.replace('++','+')
    return exp
Re_mudi = re.compile(r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?')
def Res_MulDiv(comput):
    while Re_mudi.search(comput):
        ret = Re_mudi.search(comput)
        comput = comput.replace(ret.group(),Mult_Divide(ret.group()),1)
    return comput
Re_adde = re.compile(r'[+-]?\d+(?:\.\d+)?')
def Res_AdDe(comput,count=0):
    for num in Re_adde.findall(comput):count += float(num)
    comput = comput.replace(comput,str(count))
    return comput
def Cal(comput):
    res = Res_MulDiv(comput);res = format_exp(res);res = Res_AdDe(res)
    return res
def main(comput):
    while re.search('\([^()]+\)',comput):
        inner = re.search('\([^()]+\)',comput).group()
        res = Cal(inner)
        comput = comput.replace(inner,res)
    return Cal(comput)
print(main(input('Comput >>>').strip().replace(' ','')))

猜你喜欢

转载自www.cnblogs.com/meilong/p/tuo-chan-ban-di-san-ci-da-zuo-yeji-suan-qi-zheng-z.html
今日推荐