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复制文件的方法实例详解
May 22 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 Python
python简单实例训练(21~30)
Nov 15 Python
caffe binaryproto 与 npy相互转换的实例讲解
Jul 09 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
Jun 08 Python
python对文件目录的操作方法实例总结
Jun 24 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
Aug 05 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
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
JavaScript鼠标悬停事件用法解析
2020/05/15 Javascript
Python中的自省(反射)详解
2015/06/02 Python
python数组过滤实现方法
2015/07/27 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
在Django中实现添加user到group并查看
2019/11/18 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
python实现音乐播放和下载小程序功能
2020/04/26 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
动态密码技术
2012/10/18 面试题
安全责任书范文
2014/03/12 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
求职简历自我评价范文
2015/03/10 职场文书
学术会议通知
2015/04/15 职场文书
法律进社区活动总结
2015/05/07 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
Python数据类型最全知识总结
2021/05/31 Python
Java实现注册登录跳转
2022/06/16 Java/Android