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中endswith()函数的基本使用
Apr 07 Python
DataFrame中去除指定列为空的行方法
Apr 08 Python
Python实现的求解最小公倍数算法示例
May 03 Python
python 实现A*算法的示例代码
Aug 13 Python
pytorch 转换矩阵的维数位置方法
Dec 08 Python
Python后台管理员管理前台会员信息的讲解
Jan 28 Python
django fernet fields字段加密实践详解
Aug 12 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
使用PyTorch训练一个图像分类器实例
Jan 08 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
用sleep间隔进行python反爬虫的实例讲解
Nov 30 Python
使用Djongo模块在Django中使用MongoDB数据库
Jun 20 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
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
Display SQL Server Version Information
2007/06/21 Javascript
浅谈javascript的分号的使用
2015/05/12 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
angular中的http拦截器Interceptors的实现
2017/02/21 Javascript
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
python的常见矩阵运算(小结)
2019/08/07 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
美国汽车交易网站:Edmunds
2016/08/17 全球购物
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
2014年财务工作自我评价
2014/09/23 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
体育教师研修感悟
2015/11/18 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang