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 相关文章推荐
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
浅谈Python中range和xrange的区别
Dec 20 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
Django使用详解:ORM 的反向查找(related_name)
May 30 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
Python 元组操作总结
Sep 18 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 Python
python异常处理和日志处理方式
Dec 24 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
Mar 11 Python
pyCharm 实现关闭代码检查
Jun 09 Python
python使用自定义钉钉机器人的示例代码
Jun 24 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
在普通HTTP上安全地传输密码
2007/07/21 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
2011/05/09 PHP
PHP制作用户注册系统
2015/10/23 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
深入理解Node module模块
2018/03/26 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
讲解Python中if语句的嵌套用法
2015/05/14 Python
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
Python数据结构与算法之图结构(Graph)实例分析
2017/09/05 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
培训主管的岗位职责
2013/11/23 职场文书
教学评估实施方案
2014/03/16 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
元旦趣味活动方案
2014/08/22 职场文书
党员批评与自我批评发言
2014/10/02 职场文书
邀请函的格式
2015/01/30 职场文书
2015年读书月活动总结
2015/03/26 职场文书
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers