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为tornado添加recaptcha验证码功能
Feb 26 Python
在Python中使用poplib模块收取邮件的教程
Apr 29 Python
Python中集合的内建函数和内建方法学习教程
Aug 19 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
Python快速排序算法实例分析
Nov 29 Python
Python构建网页爬虫原理分析
Dec 19 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
selenium python 实现基本自动化测试的示例代码
Feb 25 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
python的数学算法函数及公式用法
Nov 18 Python
python3.9之你应该知道的新特性详解
Apr 29 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下载CSS文件中的图片的代码
2013/09/24 PHP
Chrome Web App开发小结
2014/09/04 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
php动态绑定变量的用法
2015/06/16 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
通过循环优化 JavaScript 程序
2019/06/24 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
python使用Tesseract库识别验证
2018/03/21 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
付款委托书范本
2014/04/04 职场文书
公司寄语大全
2014/04/10 职场文书
致接力运动员加油稿
2015/07/21 职场文书
生日宴会祝酒词
2015/08/10 职场文书
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android