• 【正则】——作业计算数学运算


    # ### 正则计算器
    import re
    strvar = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))" # 2776672.6952380957
    # strvar = "-30+(40+5*-2+3/2)*8 + (4- 7) "

    print(eval(strvar)) # 2776672.6952380957


    # 处理符号
    def sign_exp(strvar):
    strvar = strvar.replace("+-","-")
    strvar = strvar.replace("--","+")
    strvar = strvar.replace("-+","-")
    strvar = strvar.replace("++","+")
    return strvar

    # 计算表达式
    def calc_exp(strvar):
    # 判断字符串是 乘法 还是 除法
    if "*" in strvar:
    a,b = strvar.split("*")
    return float(a) * float(b)

    if "/" in strvar:
    a,b = strvar.split("/")
    return float(a) / float(b)

    # 操作表达式
    def opreate_exp(strvar):
    # 先算乘除
    while True:
    # (40+5*-2+3/2)
    # 匹配 [谁*谁] 或者 [谁/谁] 例: 5*-2 3/2
    obj = re.search(r"d+(.d+)?[*/][+-]?d+(.d+)?",strvar)
    if obj:
    res1 = obj.group()
    # print(res1) # 5*-2
    # 计算表达式的结果
    res2 = calc_exp(res1)
    # print(res2 , type(res2)) # -10.0 <class 'float'>
    # 将所得的结果,替换到原来的字符串当中,以匹配下一个乘法或者除法
    strvar = strvar.replace(res1,str(res2))
    # print(strvar) # (40+-10.0+3/2)
    else:
    # 当obj 返回None的时候停止
    break

    # 处理表达式中的符号
    strvar = sign_exp(strvar)
    # print(strvar) # (40+-10.0+1.5) (40-10.0+1.5)

    # 计算剩下+-的表达式(将每一个数字匹配出来,做累加)
    lst = re.findall("[+-]?d+(?:.d+)?",strvar)
    # print(lst) # ['40', '-10.0', '+1.5']
    total = 0
    for i in lst:
    total += float(i)
    # print(total) # 31.5
    return total

    # 移除括号
    def remove_bracket(strvar):
    while True:
    obj = re.search("([^()]+)",strvar)
    # print(obj)
    if obj:
    res1 = obj.group()
    # print(res1) # (40+5*-2+3/2) "-30+(40+5*-2+3/2)*8 +(4-7)"
    # 计算一个括号里面表达式的值
    res2 = opreate_exp(res1)
    # print(res2) # 31.5
    # 替换原来的括号,消除括号
    strvar = strvar.replace(res1,str(res2))
    # print(strvar) # -30+31.5*8+(4-7)
    else:
    return strvar # 返回一串没有括号的表达式

    # main函数当中不写逻辑,只调用相关的功能
    def main(strvar):
    # 1.整理数据,把没用的空格去掉
    strvar = strvar.replace(" ","")
    # 2.移除所有括号
    strvar = remove_bracket(strvar)
    # print(strvar) # -30+31.5*8+-3.0
    # 3.计算表达式
    return opreate_exp(strvar)

    res = main(strvar)
    print(res) # 219.0

  • 相关阅读:
    拦截器-监听器-过滤器的区别
    实例Rest风格+SpringMVC+中文乱码解决
    Nginx功能详细介绍(大而全)
    Nginx应⽤场景之反向代理
    SpringMVC参数传递之日期类型
    SpringMVC请求参数绑定回顾
    数据输出机制之Model、Map及ModelMap回顾
    ReactHook快速上车
    Chrome性能调优技巧
    移动端适配的最佳实践
  • 原文地址:https://www.cnblogs.com/bonnyxinxin/p/13026371.html
Copyright © 2020-2023  润新知