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脚本实现DNSPod DNS动态解析域名
Feb 14 Python
python操作sqlite的CRUD实例分析
May 08 Python
Python爬虫爬验证码实现功能详解
Apr 14 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
Python-while 计算100以内奇数和的方法
Jun 11 Python
ML神器:sklearn的快速使用及入门
Jul 11 Python
python 正则表达式参数替换实例详解
Jan 17 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
Pytest框架之fixture的详细使用教程
Apr 07 Python
基于python requests selenium爬取excel vba过程解析
Aug 12 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
Python IO文件管理的具体使用
Mar 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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
解析php addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
treepanel动态加载数据实现代码
2012/12/15 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
Node.js模块全局安装路径配置方法
2018/05/17 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
讲解Python中运算符使用时的优先级
2015/05/14 Python
Python字符串格式化
2015/06/15 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
Python爬取微信小程序通用方法代码实例详解
2020/09/29 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
Django解决frame拒绝问题的方法
2020/12/18 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
团员的自我评价
2013/12/01 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
消防演习感想
2015/08/10 职场文书
详解NodeJS模块化
2021/06/15 NodeJs
图文详解nginx日志切割的实现
2022/01/18 Servers