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通过imaplib模块读取gmail里邮件的方法
May 08 Python
python获取文件扩展名的方法
Jul 06 Python
Python脚本暴力破解栅栏密码
Oct 19 Python
python3对接mysql数据库实例详解
Apr 30 Python
python 获取等间隔的数组实例
Jul 04 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
keras模型可视化,层可视化及kernel可视化实例
Jan 24 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
Mar 30 Python
解决Django no such table: django_session的问题
Apr 07 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 Python
python如何进行基准测试
Apr 26 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编写的抽奖程序中奖概率算法
2015/05/14 PHP
PHP引用的调用方法分析
2016/04/25 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
从javascript语言本身谈项目实战
2006/12/27 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
react性能优化达到最大化的方法 immutable.js使用的必要性
2017/03/09 Javascript
在 Angular 中实现搜索关键字高亮示例
2017/03/21 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
node中使用es6/7/8(支持性与性能)
2019/03/28 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
JS实现多功能计算器
2020/10/28 Javascript
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
Python表示矩阵的方法分析
2017/05/26 Python
Python中property属性实例解析
2018/02/10 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
python接口自动化框架实战
2020/12/23 Python
html5 标签
2009/07/16 HTML / CSS
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
某公司部分笔试题
2013/11/05 面试题
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
计划生育证明格式范本
2014/09/12 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
2014年质检员工作总结
2014/11/18 职场文书
新郎结婚保证书
2015/02/26 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书