zoukankan      html  css  js  c++  java
  • 【正则】——作业计算数学运算

    # ### 正则计算器
    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

  • 相关阅读:
    关于 __proto__和prototype的一些理解
    使用siege进行web压力测试
    Access denied for user 'root'@'localhost' (using password: YES)
    博客搬家来咯
    Permutation Transformer【Splay】
    Prime Independence 【LightOJ
    Power Sockets【CF 1469F】【线段树+贪心】
    A Bit Similar【CF 1469E】【unordered_map+bitset】
    brz的树【牛客练习赛72 F】【虚树+dfs序可持久化线段树+树上差分】
    CCA的期望【牛客练习赛74】【数学】
  • 原文地址:https://www.cnblogs.com/bonnyxinxin/p/13026371.html
Copyright © 2011-2022 走看看