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中的元组与逻辑运算符
Oct 13 Python
快速入手Python字符编码
Aug 03 Python
python解决汉字编码问题:Unicode Decode Error
Jan 19 Python
启动targetcli时遇到错误解决办法
Oct 26 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
python实现BP神经网络回归预测模型
Aug 09 Python
Python爬虫运用正则表达式的方法和优缺点
Aug 25 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 Python
Python绘图之柱形图绘制详解
Jul 28 Python
pytorch 使用半精度模型部署的操作
May 24 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数据库的php代码(一个表一个文件)
2010/05/28 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
JS控制表格隔行变色
2006/06/26 Javascript
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
JS造成内存泄漏的几种情况实例分析
2020/03/02 Javascript
vue实现购物车的监听
2020/04/20 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
python基础教程之Hello World!
2014/08/29 Python
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
python实现图片素描效果
2020/09/26 Python
python3 re返回形式总结
2020/11/20 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
优秀团员个人事迹材料
2014/01/29 职场文书
运动会广播稿20字
2014/02/18 职场文书
销售口号大全
2014/06/11 职场文书
给男朋友的道歉短信
2015/05/12 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL
bose降噪耳机音能消除人声吗
2022/04/19 数码科技