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将人民币转换大写的脚本代码
Feb 10 Python
Python学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
Python实现多线程抓取网页功能实例详解
Jun 08 Python
python删除过期log文件操作实例解析
Jan 31 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
使用Python和Scribus创建一个RGB立方体的方法
Jul 17 Python
Django REST Framework序列化外键获取外键的值方法
Jul 26 Python
Django对models里的objects的使用详解
Aug 17 Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 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
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
php实现RSA加密类实例
2015/03/26 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
js模态对话框使用方法详解
2017/02/16 Javascript
babel基本使用详解
2017/02/17 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
Python中几种操作字符串的方法的介绍
2015/04/09 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
在python里从协程返回一个值的示例
2019/02/19 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
Python中and和or如何使用
2020/05/28 Python
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
罗技英国官方网站:Logitech UK
2020/11/03 全球购物
Whistles官网:英国女装品牌
2020/08/14 全球购物
中学生评语大全
2014/04/18 职场文书
法人单位授权委托书范文
2014/10/06 职场文书
2014乡镇机关党员个人对照检查材料思想汇报
2014/10/09 职场文书
社区务虚会发言材料
2014/10/20 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
法学专业求职信范文
2015/03/19 职场文书
雷锋的观后感
2015/06/10 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python
Redis入门教程详解
2021/08/30 Redis