python正则表达式之作业计算器


Posted in Python onMarch 18, 2016

作业:计算器开发

实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致
一、说明:

有一点bug就是不能计算幂次方,如:'6**6'会报错

该计算器思路:
1、没用使用递归,先找出并计算所有括号里的公式,再计算乘除和加减
2、所有的数字都认为是浮点型操作,以此来保留小数
使用技术:
1、正则表达式
2、tkinter

二、流程图:

python正则表达式之作业计算器

 python正则表达式之作业计算器

 三、代码如下:

#!/usr/bin/env python3
#antuor:Alan
 
import re
from functools import reduce
from tkinter import *
 
 
 
'''处理特殊-号运算'''
def minus_operation(expresstion):
 minus_operators = re.split("-",expresstion)
 calc_list = re.findall("[0-9]",expresstion)
 if minus_operators[0] =="":
  calc_list[0] = '-%s' % calc_list[0]
 res = reduce(lambda x,y:float(x)-float(y),calc_list)
 print(">>>>>>>>>>>>>>减号[%s]运算结果:" % expresstion,res)
 return res
 
'''reduce()对sequence连续使用function, 如果不给出initial, 则第一次调用传递sequence的两个元素,
以后把前一次调用的结果和sequence的下一个元素传递给function'''
 
 
 
 
'''处理双运算符号'''
def del_duplicates(expresstion):
 expresstion = expresstion.replace("++","+")
 expresstion = expresstion.replace("--","-")
 expresstion = expresstion.replace("+-","-")
 expresstion = expresstion.replace("--","+")
 expresstion = expresstion.replace('- -',"+")
 e
 return expresstion
 
'''*/运算函数'''
def mutiply_dividend(expresstion):
 calc_list = re.split("[*/]",expresstion)   #用* or /分割公式
 operators = re.findall("[*/]",expresstion)  #找出所有*和/号
 res = None
 for index,i in enumerate(calc_list):
  if res:
   if operators[index-1] =='*':
    res *= float(i)
   elif operators[index-1] =='/':
    res /=float(i)
  else :
   res = float(i)
 procession0 = "[%s]运算结果=" % expresstion,res
 final_result.insert(END,procession0)  #插入窗体
 print(procession0)
 return res
 
 
 
'''处理运算符号顺序混乱情况'''
def special_features(plus_and_minus_operators,multiply_and_dividend):
 
 for index,i in enumerate(multiply_and_dividend):
  i = i.strip()
  if i.endswith("*") or i.endswith("/"):
   multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]
   del multiply_and_dividend[index+1]
   del plus_and_minus_operators[index]
 return plus_and_minus_operators,multiply_and_dividend
 
 
 
def minus_special(operator_list,calc_list):
 for index,i in enumerate(calc_list):
  if i =='':
   calc_list[index+1] = i + calc_list[index+1].strip()
 
 
 
'''运算除了()的公式+-*/'''
def figure_up(expresstion):
 expresstion = expresstion.strip("()")  #去掉外面括号
 expresstion = del_duplicates(expresstion) #去掉重复+-号
 plus_and_minus_operators = re.findall("[+-]",expresstion)
 multiply_and_dividend = re.split("[+-]",expresstion)
 if len(multiply_and_dividend[0].strip()) ==0:
  multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1]
  del multiply_and_dividend[0]
  del plus_and_minus_operators[0]
 
 plus_and_minus_operators,multiply_and_dividend = special_features(plus_and_minus_operators,multiply_and_dividend)
 for index,i in enumerate(multiply_and_dividend):
  if re.search("[*/]",i):
   sub_res = mutiply_dividend(i)
   multiply_and_dividend[index] = sub_res
 
 print(multiply_and_dividend,plus_and_minus_operators) #计算
 final_res = None
 for index,item in enumerate(multiply_and_dividend):
  if final_res:
   if plus_and_minus_operators[index-1] == '+':
    final_res += float(item)
   elif plus_and_minus_operators[index-1] == '-':
    final_res -= float(item)
  else:
   final_res = float(item)
 procession = '[%s]计算结果:' % expresstion,final_res
 final_result.insert(END,procession)  #插入窗体
 print(procession)
 return final_res
 
"""主函数:运算逻辑:先计算拓号里的值,算出来后再算乘除,再算加减"""
def calculate():
 expresstion = expresstions.get()     #获取输入框值
 flage = True
 calculate_res = None        #初始化计算结果为None
 while flage:
  m = re.search("\([^()]*\)",expresstion)  #先找最里层的()
  # pattern = re.compile(r"\([^()]*\)")
  # m = pattern.match(expresstion)
  if m:
   sub_res = figure_up(m.group())   #运算()里的公式
   expresstion = expresstion.replace(m.group(),str(sub_res)) #运算完毕把结果替换掉公式
  else:
   print('---------------括号已经计算完毕--------------')
   procession1 = "最终计算结果:",figure_up(expresstion)
   final_result.insert(END,procession1)  #插入窗体
   print('\033[31m最终计算结果:',figure_up(expresstion))
 
   flage = False
 
 
if __name__=="__main__":
 # res = calculate("1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )")
 window = Tk()     ###创建窗体
 window.title('计算器')  ###命名窗体
 frame1 = Frame(window)  ###框架1
 frame1.pack()    ###放置
 frame2 = Frame(window)  ###框架2
 frame2.pack()    ###放置
 lable = Label(frame1,text = "请输入公式:") ###文字标签
 lable.pack()
 expresstions = StringVar() ###输入框属性,字符串
 entryname = Entry(frame1,textvariable = expresstions) ###文本输入框
 bt_get_expresstions = Button(frame1,text = "提交",command = calculate) ###按钮挂件
 bt_get_expresstions.pack()
 entryname.pack()
 lable.grid(row =1,column =1) ###位置
 entryname.grid(row=1,column =2)
 bt_get_expresstions.grid(row =1,column =3)
 final_result = Text(frame2) ###计算结果显示框
 final_result.tag_config("here", background="yellow", foreground="blue")
 final_result.pack()
 window.mainloop()    ###事件循环

以上就是本文的全部内容,希望对大家的学习有所帮助。

Python 相关文章推荐
跟老齐学Python之正规地说一句话
Sep 28 Python
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
常用python编程模板汇总
Feb 12 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
Python3实现的字典遍历操作详解
Apr 18 Python
python将回车作为输入内容的实例
Jun 23 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
windows下numpy下载与安装图文教程
Apr 02 Python
python实现图片批量压缩
Apr 24 Python
Python中使用subprocess库创建附加进程
May 11 Python
基于python yield机制的异步操作同步化编程模型
Mar 18 #Python
理解Python中的With语句
Mar 18 #Python
简述Python中的进程、线程、协程
Mar 18 #Python
Python实现计算最小编辑距离
Mar 17 #Python
Python引用模块和查找模块路径
Mar 17 #Python
Python使用tablib生成excel文件的简单实现方法
Mar 16 #Python
Python保存MongoDB上的文件到本地的方法
Mar 16 #Python
You might like
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
php获取淘宝分类id示例
2014/01/16 PHP
php数组查找函数总结
2014/11/18 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
javascript实现仿银行密码输入框效果的代码
2007/12/13 Javascript
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
2018/09/03 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
python出现"IndentationError: unexpected indent"错误解决办法
2017/10/15 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
基于python requests库中的代理实例讲解
2018/05/07 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
Python实现EM算法实例代码
2020/10/04 Python
年终自我鉴定
2013/10/09 职场文书
监察建议书范文
2014/03/12 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
python调试工具Birdseye的使用教程
2021/05/25 Python
python中的random模块和相关函数详解
2022/04/22 Python
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript