• 用正则表达式实现的计算器


    前面我们有讲到python中的re模块,当然用到最多的地方还是爬虫,由于还有一个知识点没讲,所以就用re做的一个计算器给大家熟悉re模块。

    首先我们应该先梳理一下计算器的实现过程,当然,有几种实现方法。先从最简单的开始讲吧。下面是计算器的思考流程。

    1,考虑计算的优先级

    ()的优先级最高,其次是乘除,最后是加减

    2,算最里面括号的值,并代替原括号表达式

    3,没有括号的先算乘除,然后算完把最终值,代替成原先表达式

    4,没有括号的算完乘除,计算只有加减的表达式,并且把结果代替成原来表达式

    5,循环去括号,乘除,加减(在计算过程中记得对--,或者+-等情况的处理)

    这是最简单也是最好理解的方法来实现基础的计算器。下面的代码是根据上面的思路写出来的。

     1 import re
     2 def deal_false(exp):
     3     #处理当符号没有省略
     4     exp=exp.replace('--','+')#把--变为+
     5     exp=exp.replace('+-','-')#把+-变为-
     6     return exp
     7 def deal_bracket(exp):
     8     #处理最里面的那一层括号
     9     while True:
    10         new_exp=re.search('([^()]+)',exp)#筛选最里层的括号内容
    11         if new_exp:
    12             new_exp=new_exp.group()
    13             res=calculate(new_exp)
    14             exp=exp.replace(new_exp,res)
    15             exp = deal_false(exp)
    16         else:
    17             exp = deal_false(exp)
    18             res=calculate(exp)
    19             exp=exp.replace(exp,res)
    20             return exp
    21 def calculate(exp):
    22     #计算没有括号的式子
    23     # exp=exp.strip("()")
    24     while True:
    25         mul_exp = re.search('-?d+.?d*[*/]-?d+.?d*', exp)#筛选乘除法表达式
    26         if mul_exp:
    27             mul_exp =mul_exp.group()
    28             res = calculate_mul(mul_exp)
    29             exp = exp.replace(mul_exp, res)
    30         else:
    31             res=calculate_add(exp)
    32             exp = exp.replace(exp, res)
    33             return exp
    34 def calculate_mul(exp):
    35     #计算乘法或者除法
    36     if '*' in exp:
    37         x,y=exp.split('*')
    38         return str(float(x)*float(y))
    39     elif '/' in exp:
    40         x,y=exp.split('/')
    41         return str(float(x)/float(y))
    42 def calculate_add(exp):
    43     #计算只有加减法
    44     sum=0
    45     exp=re.findall('-?d+.?d*',exp)
    46     for i in exp:
    47         sum+=float(i)
    48     return str(sum)
    49 def main(exp):
    50     #主函数,计算机的入口
    51     exp=exp.replace(' ','')#去掉空格
    52     print(deal_bracket(exp))
    53 if __name__ == '__main__':
    54     x=input(">>>>")
    55     main(x)
    View Code

    当然还有很多种,实现方法,还可以写好处理不同运算符号,然后对应不同的函数。emmmm,有时间我会补充在后面的,计算器还是比较简单,只要你去写了,去实现了还是会有很大的收获的。

  • 相关阅读:
    C#通过文件头判断图像格式(摘录)
    devenv.exe 应用程序错误
    LINQ TO SQL中的selectMany(转)
    DragDrop registration did not succeed. (摘录)
    API各函数作用简介(转)
    Linq递归用法(摘录)
    (转)逐步为对象集合构建一个通用的按指定属性排序的方法
    何止 Linq 的 Distinct 不给力(转)
    关于sql日志文件
    DES算法的C#实现
  • 原文地址:https://www.cnblogs.com/zzqit/p/9222119.html
Copyright © 2020-2023  润新知