re模块正则表达式的实际运用(计算器设计)

import re
def cal_atomexp(atom_exp):
    # 计算乘除法
    if '*' in atom_exp:
        a, b = atom_exp.split('*')
        return str(float(a) * float(b))
    elif '/' in atom_exp:
        a, b = atom_exp.split('/')
        return str(float(a) / float(b))

def cal_muldiv(inner_bracket):
    while True:  # 计算括号里的所有乘除法
        ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?', inner_bracket)# 匹配第一个乘除法
        if not ret: break
        atom_exp = ret.group()  # 获取乘除法表达式  # 2*5
        atom_res = cal_atomexp(atom_exp)  # 计算乘除法的函数,得到结果  10.0
        inner_bracket = inner_bracket.replace(atom_exp, str(atom_res))
        # 将得到的结果与匹配到的表达式进行替换
    return inner_bracket  # 返回的是一个纯加减法组成的算式

def cal_addsub(inner_bracket):
    # 计算括号中的所有加减法
    ret_l = re.findall('[-+]?\d+(?:\.\d+)?', inner_bracket) # 找到所有的数字以及它前面的符号
    sum = 0
    for ret in ret_l:
        sum+=float(ret)
    return str(sum)

def format_exp(exp):
    # 给表达式做格式化
    exp = exp.replace('--','+')
    exp = exp.replace('+-','-')
    exp = exp.replace('++','+')
    exp = exp.replace('-+','-')
    return exp

def cal_bracket(exp): # 计算括号内的
    exp = cal_muldiv(exp)  # 括号内的 : 计算了所有乘除法,只剩下加减法的表达式
    exp = format_exp(exp)  # 计算完乘除法之后,会有一些符号问题,要替换掉所有++ -- -+ +-的情况
    return cal_addsub(exp) # 计算所有的加减法

def main(s):   # s = 总表达式
    s = s.replace(' ', '') # 给总表达式s去空格,去掉空格之后s是没有空格的表达式
    while True:
        inner_bracket = re.search('\([^()]+\)', s) # 找最内层的小括号,得到一个对象
        if not inner_bracket: break  # 找不到小括号了就退出
        inner_bracket = inner_bracket.group() # 通过对象.group()得到一个内部没有小括号的表达式
        res = cal_bracket(inner_bracket) # 计算表达式
        s = s.replace(inner_bracket, res) # 用括号内的计算结果去替换匹配到的括号赋值给s
    return cal_bracket(s)

s = '1-2*((60-30 +(9-2*5/3+7/3*99/4*2998+10*568/14)*(-40 / 5))-(-4*3)/(16-3*2))'
print(main(s))  # 程序的总入口
print(eval(s))

总体思路就是先算最内层括号里的乘除,然后再算加减 ,通过对函数体的循环得到最终结果.

猜你喜欢

转载自www.cnblogs.com/smile568968/p/9482630.html
今日推荐