zoukankan      html  css  js  c++  java
  • 利用正则编写简单的计算器

     1 # s="1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )"
     2 while True:
     3     s=input("请输入要计算的数字》》》")
     4     import re                # 导入re模块
     5     def chu_cheng(l):        #定义乘除函数
     6         l = re.findall(r"(?:*|/)?-?d+(?:.d+)?", l)  # 匹配*或者/ 然后有负号匹配负号,后面在加上数字
     7         total=float(l[0])  #第一个数字前面肯定是没有乘除号的
     8         del l[0]
     9         for i in l:  #将l里面的第一个元素删除后,就可进行for循环
    10             if "/"in i:  #判断元素里面是/还是*
    11                 total = total / float(i.split("/")[1])
    12             if "*" in i:
    13                 total = total * float(i.split("*")[1])
    14         return "+"+str(total) #加个+的原因是,在提取l的时候会存在将前面的-或+取到,防止计算后是正数而使得与前面数字没办法相加
    15     def jia_jian(l):         #定义加减函数
    16         l=re.findall("[-+]?d+(?:.d+)?",l) #将传进来的l进行匹配,匹配模式为 前面的符号加上数字
    17         total=0
    18         for i in l:             #依次循环相加
    19             total+=float(i)
    20         return str(total)
    21     def xuan_ze(i):            #定义判断函数,选择根据有无乘除号选择计算的函数
    22             if "*" in i or "/" in i:
    23                 l = re.search(r"((-|+)?d+(.d+)?(*|/))+(-|+)?d+(.d+)?", i).group()
    24                 #匹配带有乘除号的式子,数字前面的负号也会取到
    25                 tu = chu_cheng(l) #调用乘除函数
    26                 i = tu.join(i.split(l)) #将i以l进行分割,然后再将计算的结果tu替换l, **重点:有相同的l全部替换
    27                 return xuan_ze(i) #递归,将i中所有带有/或*的部分全部进行运算
    28             else:return jia_jian(i) #在没有*或/后,调用加减函数 并将计算结果返回
    29     while True:             #循环
    30         # dic={" ": "", r"--": "+", r"-+": "-", r"++": "+", r"+-": "-"} #*************************其他思路
    31         # for i, j in dic.items(): #注:对于必须替换"++,-+,+-,--,空格"这种情况,在必须替换时可用这种思路
    32         #     s = re.sub(i, j, s)
    33         s=re.sub(" ", "", s) #去除传入的s中空格
    34         s=re.sub(r"--", "+",s)#如果存在--将其转换为+号,**注:+-不影响,因为在每次取值时,我都会取前面的符号,+-的话,加号无意义
    35         # 重点:不会存在-+(除非sb输入)的情况,因为在去括号的时候,进行加减操作后,+号会被去掉的
    36         if "("in s:    #如果有括号,进行寻找括号里面数据的操作
    37             res=re.search(r"([^()]+)",s).group() #只匹配里面括号里面无括号的数据
    38             i=xuan_ze(res)  #调用选择函数,进行判断有无乘除号
    39             s=i.join(s.split(res))  #将原式子以res进行分割,并将计算结果i替换进去
    40         else:          #在没有括号的情况下
    41             s=xuan_ze(s) #调用选择函数,进行判断计算
    42             break   #结束循环
    43     print(s) #打印
  • 相关阅读:
    【带着canvas去流浪(5)】绘制K线图
    【带着canvas去流浪(4)】绘制散点图
    【带着canvas去流浪】 (3)绘制饼图
    Mybatis缓存(1)--------系统缓存及简单配置介绍
    this引用逃逸
    MySQL优化(1)--------常用的优化步骤
    Java的内存模型
    Java Generator
    深入理解Java重载与重写
    对象的自我救赎
  • 原文地址:https://www.cnblogs.com/zhangge123/p/6786796.html
Copyright © 2011-2022 走看看