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

前面我们有讲到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,有时间我会补充在后面的,计算器还是比较简单,只要你去写了,去实现了还是会有很大的收获的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值