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使用Matplotlib实现Logos设计代码
Dec 25 Python
用Python一键搭建Http服务器的方法
Jun 01 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
对Python使用mfcc的两种方式详解
Jan 09 Python
Python判断telnet通不通的实例
Jan 26 Python
python 阶乘累加和的实例
Feb 01 Python
django-rest-swagger的优化使用方法
Aug 29 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
python实现FTP循环上传文件
Mar 20 Python
Python的控制结构之For、While、If循环问题
Jun 30 Python
python多线程semaphore实现线程数控制的示例
Aug 10 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图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
JQuery开发的数独游戏代码
2010/10/29 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
jQuery中prop()方法用法实例
2015/01/05 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
2016/11/23 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
Python中线程编程之threading模块的使用详解
2015/06/23 Python
Python基础语法(Python基础知识点)
2016/02/28 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
python django事务transaction源码分析详解
2017/03/17 Python
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
详解python中sort排序使用
2019/03/23 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
公司董事长职责
2013/12/12 职场文书
2014年创卫实施方案
2014/02/18 职场文书
计算机系本科生求职信
2014/05/31 职场文书
公路施工安全责任书
2015/05/08 职场文书
Python开发简易五子棋小游戏
2022/05/02 Python