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排序算法实例代码
Aug 10 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
python requests爬取高德地图数据的实例
Nov 10 Python
解决pyinstaller打包pyqt5的问题
Jan 08 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
Pytorch GPU显存充足却显示out of memory的解决方式
Jan 13 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
python代数式括号有效性检验示例代码
Oct 04 Python
python 批量下载bilibili视频的gui程序
Nov 20 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 Python
如何利用python实现Simhash算法
Jun 28 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
基于文本的搜索
2006/10/09 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
vue实现百度语音合成的实例讲解
2019/10/14 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
python笔记:mysql、redis操作方法
2017/06/28 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
求职信模板标准格式范文
2014/02/23 职场文书
身边的榜样活动方案
2014/08/20 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
个人合作协议范本
2015/08/06 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python