python正则实现计算器功能


Posted in Python onDecember 14, 2017

本文实例为大家分享了python正则实现计算器功能的具体代码,供大家参考,具体内容如下

# -*- coding: utf-8 -*- 
# Author :Gogh 
# @Time  :2017/12/4 20:16 
# @Email :361910002@qq.com 
import re 
def operator_update(formula): 
 # 对formula公式进行 去除空字符,更新运算符处理 
 formula = formula.replace(" ", "") # 去除空字符 
 formula = formula.replace("+-", "-") 
 formula = formula.replace("--", "+") 
 return formula 
 
 
def calc_muldiv(formula_list): 
 ''''' 
 计算公式里面的乘除 
 :param formula: 列表 
 :return: 
 ''' 
 for index, element in enumerate(formula_list): 
  if "*" in element or "/" in element: 
   operators = re.findall("[*/]", element) 
   calc_list = re.split("[*/]", element) 
   num = None 
   for i, e in enumerate(calc_list): 
    if num: 
     if operators[i - 1] == "*": 
      num *= float(e) 
     elif operators[i - 1] == "/": 
      num /= float(e) 
    else: 
     num = float(e) 
   formula_list[index] = num 
 return formula_list 
 
 
def calc_plumin(operators, num_list): 
 ''''' 
 计算列表数字的加减 
 :param operators: 运算符列表 
 :param num_list: 进行运算的数字列表 
 :return: 返回计算结果 
 ''' 
 num = None 
 for i, e in enumerate(num_list): 
  if num: 
   if operators[i - 1] == "+": 
    num += float(e) 
   elif operators[i - 1] == "-": 
    num -= float(e) 
  else: 
   num = float(e) 
 return num 
 
 
def merge(plus_minus_operator, multiply_divide_list): 
 ''''' 
 把列表中这样的形式'2*' '-3*' '5/3*' '4/2'合并到一块 
 :param formula_list: 
 :return: 
 ''' 
 for index, element in enumerate(multiply_divide_list): 
  if element.endswith("*") or element.endswith("/"): 
   multiply_divide_list[index] = element + plus_minus_operator[index] + multiply_divide_list[index + 1] 
   del multiply_divide_list[index + 1] 
   del plus_minus_operator[index] 
   return merge(plus_minus_operator, multiply_divide_list) 
 return plus_minus_operator, multiply_divide_list 
 
 
def bracket_calc(formula): 
 ''''' 
 对括号最内层的formula公式进行计算 
 :param formula: 
 :return: 
 ''' 
 formula = re.sub("[()]", "", formula) # 去除两边的() 
 formula = operator_update(formula) 
 plus_minus_operator = re.findall("[+-]", formula) # 列表 '+' '-' 运算符 
 multiply_divide_list = re.split("[+-]", formula) # 列表 有'*' '/' 
 if multiply_divide_list[0] == "": # multiply_divide_list列表第一个字符为空的话,表示一个数字为负号 
  multiply_divide_list[1] = "-" + multiply_divide_list[1] 
  del plus_minus_operator[0] 
  del multiply_divide_list[0] 
 res = merge(plus_minus_operator, multiply_divide_list) 
 plus_minus_operator = res[0] # 列表 '+' '-' 运算符 进行合并处理 
 multiply_divide_list = res[1] 
 plus_minus_list = calc_muldiv(multiply_divide_list) # 生成只进行加减运算的列表 
 res = calc_plumin(plus_minus_operator, plus_minus_list) 
 return res 
 
 
def calculate(formula): 
 '''''计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减''' 
 while True: 
  formula_depth = re.search("[()]+", formula) 
  if formula_depth: 
   formula_depth = formula_depth.group() 
   res = bracket_calc(formula_depth) 
   formula = formula.replace(formula_depth, str(res)) 
   print("\33[34;1m%s\33[0m" % (formula)) 
  else: 
   res = bracket_calc(formula) 
   print("\33[31;1m结果:%s\33[0m" % (res)) 
   exit() 
 
 
if __name__ == '__main__': 
 formula = "1 - 2 * ( (60-30 +(-9-2- 5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) -(-4*3)/ (16-3*2) )" 
 calculate(formula)

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的sort方法使用详解
Jul 25 Python
python处理PHP数组文本文件实例
Sep 18 Python
Windows下PyMongo下载及安装教程
Apr 27 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
Oct 25 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
python通过matplotlib生成复合饼图
Feb 06 Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
python如何用matplotlib创建三维图表
Jan 26 Python
python实现层次聚类的方法
Nov 01 Python
Python可视化学习之seaborn调色盘
Feb 24 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 #Python
python实现BackPropagation算法
Dec 14 #Python
python实现随机梯度下降(SGD)
Mar 24 #Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 #Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 #Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 #Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 #Python
You might like
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
php 空格,换行,跳格使用说明
2009/12/18 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
js异或加解密效果代码
2008/06/25 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
基于jQuery的获取标签名的代码
2012/07/16 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
JS画线(实例代码)
2013/11/20 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
Node.js websocket使用socket.io库实现实时聊天室
2017/02/20 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
appium+python adb常用命令分享
2020/03/06 Python
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
酒店前厅员工辞职信
2014/01/08 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
会计系毕业生求职信
2014/05/28 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
音乐会主持人开场白
2015/05/28 职场文书
2019银行竞聘书
2019/06/21 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书