watchslowly
#!/bin/env python
# -*- coding:utf-8 -*-
\'\'\'
实现能计算类似
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))公式
\'\'\'

import re

def cal_mini_exp(mini):
    #计算40/5 2*5这样的表达式
    if \'*\' in mini:
        mun1,mun2 = mini.split(\'*\')
        return str(float(mun1) * float(mun2))
    elif \'/\' in mini:
        mun1, mun2 = mini.split(\'/\')
        return str(float(mun1) / float(mun2))



def conform(exp):
    exp = exp.replace(\'--\',\'+\')
    exp = exp.replace(\'+-\',\'-\')
    exp = exp.replace(\'-+\',\'-\')
    exp = exp.replace(\'++\',\'+\')
    return exp

def calculate(son_exp):
    \'\'\'
    计算内部不在有小括号表达式的结果
    :param exp:
    :return:
    \'\'\'
    son_exp = son_exp.strip(\'()\')
    while True:   #完成一个表达式乘除法的计算
        ret = re.search(\'\d+\.?\d*[*/]-?\d+\.?\d*\',son_exp)      #9-2*5/3+7/3*99/4*2998+10*568/14 匹配乘除表达式
        if ret:
            mini_exp = ret.group()
            # 40/5 2*5
            res = cal_mini_exp(mini_exp)  #40/5=8
            son_exp = son_exp.replace(mini_exp,res,1)
        else:break

    son_exp = conform(son_exp)   #整理表达式中的符号
    ret_l = re.findall(\'[+-]?\d+\.?\d*\',son_exp)
    sum = 0
    for i in ret_l:
        sum += float(i)

    return str(sum)



exp = \'1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))\'
a = exp
#去空格
exp = exp.replace(\' \',\'\')
#print(exp)

while True:
    #把表达中所有的小括号表达式都计算出来
    ret = re.search(\'\([^()]+\)\',exp)   #是否匹配上的对象
    if ret:
        son_exp = ret.group()    #子表达式
        print(\'匹配小括号:%s\' % son_exp)
        #计算乘除法,再计算加减
        ret = calculate(son_exp)

        exp = exp.replace(son_exp,ret,1)
    else:
        break


print(\'最外层括号表达式:%s\' % exp)
ret = calculate(exp)
print(ret)
print(\'eval结果:\',eval(a))

 

分类:

技术点:

相关文章:

  • 2021-12-19
  • 2021-12-02
  • 2021-11-27
  • 2021-11-27
  • 2021-09-02
  • 2021-12-10
猜你喜欢
  • 2017-11-30
  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
  • 2021-09-08
相关资源
相似解决方案