利用正则编写简单的计算器

 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) #打印

 

posted @ 2017-04-30 00:43  加油头头  阅读(221)  评论(0编辑  收藏  举报