python代码计算1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7/3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))


exp= '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7/3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))'
print(eval(exp))
import re
#按照加减乘除找最左边的
def arithmetic(s):
    if re.search(r"\(\s{0,}-", s):
        ret=re.search(r"(-?\d+(?:\.\d+)?)\s{0,}([-+*/])\s{0,}(-?\d+(?:\.\d+)?)",s)
    else:
        ret = re.search(r"(\d+(?:\.\d+)?)\s{0,}([-+*/])\s{0,}(-?\d+(?:\.\d+)?)", s)
    return ret
#找到乘法和除法
def dd(s):
    if re.search(r"\(-",s):
        ret = re.search(r"(-?\d+(?:\.\d+)?)\s{0,}([/*])\s{0,}(-?\d+(?:\.\d+)?)", s)
    else:
        ret = re.search(r"(\d+(?:\.\d+)?)\s{0,}([/*])\s{0,}(-?\d+(?:\.\d+)?)", s)
    return ret
#根据传过来的值判断结果
def jia(a,d,b):
    a=float(a)
    b=float(b)
    if d == '+':
        return a+b
    elif d == '-':
        return a-b
    elif d == '*':
        return a*b
    elif d == '/':
        return a/b
#找到字符里面的小括号
def xkh(s):
    ret=re.search(r"\([^()]+\)",s)
    return ret
#第一个参数是最初始字符,
def fff(exp):
    sa=xkh(exp) #得到小括号里面的值
    if sa:
        f = dd(str(sa.group()))#先按照乘法和除法找最左边的
        if f:
            sum = jia(f.group(1), f.group(2), f.group(3))  # 计算结果
            r1 = exp.replace(f.group(), str(sum))  # 替换字符
            return r1 #返回替换后的字符
        else:
            f = arithmetic(str(sa.group()))#按照加减乘除找最左边的
            if f:
                sum = jia(f.group(1), f.group(2), f.group(3))  # 计算结果
                r3 = exp.replace(f.group(), str(sum))  # 替换字符
                return r3
            else:
                ret = re.search("[(](.*)[)]", sa.group())
                r2 = exp.replace(ret.group(), ret.group(1))  # 替换字符
                return r2
    else:
        s=dd(exp)#按照乘除法从左边找
        if s:
            sum = jia(s.group(1), s.group(2), s.group(3))  # 计算结果
            r1 = exp.replace(s.group(), str(sum))  # 替换字符
            return r1  # 返回替换后的字符
        else:
            s = arithmetic(exp)#
            if s:
                sum = jia(s.group(1), s.group(2), s.group(3))  # 计算结果
                r1 = exp.replace(s.group(), str(sum))  # 替换字符
                return r1  # 返回替换后的字符
#判断是否是小数
def is_float(str):
    if str.count('.') == 1: #小数有且仅有一个小数点
        left = str.split('.')[0]  #小数点左边(整数位,可为正或负)
        right = str.split('.')[1]  #小数点右边(小数位,一定为正)
        lright = '' #取整数位的绝对值(排除掉负号)
        if str.count('-') == 1 and str[0] == '-': #如果整数位为负,则第一个元素一定是负号
            lright = left.split('-')[1]
        elif str.count('-') == 0:
            lright = left
        else:
            return False
        if right.isdigit() and lright.isdigit(): #判断整数位的绝对值和小数位是否全部为数字
            return True
        else:
            return False
    else:
        return False
d1 = exp
while 1:
    if is_float(d1):
       break
    else:
        d1 = fff(d1)
print(d1)

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值