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中stdout输出不缓存的设置方法
May 29 Python
Python中的Numeric包和Numarray包使用教程
Apr 13 Python
Python算法应用实战之栈详解
Feb 04 Python
python在ubuntu中的几种安装方法(小结)
Dec 08 Python
matplotlib中legend位置调整解析
Dec 19 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
基于python实现百度翻译功能
May 09 Python
关于tf.nn.dynamic_rnn返回值详解
Jan 20 Python
tensorflow pb to tflite 精度下降详解
May 25 Python
keras和tensorflow使用fit_generator 批次训练操作
Jul 03 Python
python glom模块的使用简介
Apr 13 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
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
JS实现获取当前URL和来源URL的方法
2016/08/24 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
python实现图片文件批量重命名
2020/03/23 Python
从0开始的Python学习016异常
2019/04/08 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
python 进程的几种创建方式详解
2019/08/29 Python
Python tornado上传文件的功能
2020/03/26 Python
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
VC++笔试题
2014/10/13 面试题
11月红领巾广播稿
2014/01/17 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
创业培训计划书
2014/05/03 职场文书
初中教师业务学习材料
2014/05/12 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL