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

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

相关文章

jquery.validate使用攻略(表单校验) 目录 jquery.validate...
/\s+/g和/\s/g的区别 正则表达式/\s+/g...
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母...
this.optional(element)的用法 this.optional(element)是jqu...
jQuery.validate 表单动态验证 实际上jQuery.validate提供了...
自定义验证之这能输入数字(包括小数 负数 ) <script ...