关于re模块写计算器

题目:     '1 - 2 * ( (60-30 + (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )* (-40/5)) - (-4*3)/ (16-3*2) )'  用re模块解决此问题.

解题思路:1. 按照运算顺序先找到要被优先计算的算式:括号是在所有运算中优先级最高的,所以先要找到所有内部没有括号运算的算式;

     2. 在第1步中找到的算式按照运算顺序优先处理乘除法,再计算加减法;

     3. 算完内部没有括号的算式后,再以运算顺序循环处理,最终取得结果.

注意事项:1. 初始算式中存在空格,应去除.

     2. 注意数字前出现两次运算符号的情况,要注意替换.

下面是计算器代码:

import re
def mul_div(atom_exp):
    '''
    专门负责计算a*b或者a/b这样的表达式的函数
    :param atom_exp: a*b或者a/b的表达式
    :return:float数据类型的结果
    '''
    if '*' in atom_exp:
        a,b= atom_exp.split('*')
        return float(a) * float(b)
    elif '/' in atom_exp:
        a,b = atom_exp.split('/')
        return float(a) / float(b)

def add_sub(no_bracket_exp):
    '''
    接收一个只有加减法的表达式,计算加减法并返回最终结果
    :param no_bracket_exp: 只剩下加减法的表达式
    :return:float数据类型的返回值
    '''
    ret_lst = re.findall('[-+]?\d+(?:\.\d+)?', no_bracket_exp)   # [-8]
    sum_count = 0
    for num in ret_lst:
        sum_count += float(num)
    return sum_count

def exp_format(exp):
    '''
    负责表达式的整理
    :param exp:接收的表达式可能含有 ++ -- +- -+等操作
    :return:返回一个没有重叠+-符号的表达式
    '''
    exp = exp.replace('--','+')
    exp = exp.replace('+-','-')
    exp = exp.replace('-+','-')
    exp = exp.replace('++','+')
    return exp

def cal(no_bracket_exp):
    '''
    负责计算加减乘除
    :param no_bracket_exp: 一个内部不再有括号的表达式
    :return:
    '''
    while True:
        ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',no_bracket_exp)
        if ret:
            ret_exp = ret.group()   # ret_exp = '2*5'
            res = str(mul_div(ret_exp))
            no_bracket_exp = no_bracket_exp.replace(ret_exp,res)
        else: break
    no_bracket_exp = exp_format(no_bracket_exp)
    sum_count = add_sub(no_bracket_exp)
    return sum_count

def main(exp):
    exp = exp.replace(' ', '')
    while True:
        ret = re.search('\([^()]+\)', exp)
        if ret:
            no_bracket_exp = ret.group()
            ret = str(cal(no_bracket_exp))
            exp = exp.replace(no_bracket_exp, ret)
        else:break
    return cal(exp)

exp = '1 - 2 * ( (60-30 +  (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )* (-40/5)) - (-4*3)/ (16-3*2) )'
res = main(exp)
print(res)

猜你喜欢

转载自www.cnblogs.com/PythonHe/p/9991077.html
今日推荐