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常规方法实现数组的全排列
Mar 17 Python
Python编程中用close()方法关闭文件的教程
May 24 Python
Python+django实现文件下载
Jan 17 Python
Python实现的归并排序算法示例
Nov 21 Python
pandas重新生成索引的方法
Nov 06 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
Nov 29 Python
对python for 文件指定行读写操作详解
Dec 29 Python
Python FtpLib模块应用操作详解
Dec 12 Python
django使用F方法更新一个对象多个对象字段的实现
Mar 28 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
python中函数返回多个结果的实例方法
Dec 16 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
2013/01/04 Javascript
js取float型小数点后两位数的方法
2014/01/18 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
遍历json 对象的属性并且动态添加属性的实现
2016/12/02 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
Python中os和shutil模块实用方法集锦
2014/05/13 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
tensorflow的计算图总结
2020/01/12 Python
pycharm设置当前工作目录的操作(working directory)
2020/02/14 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
python实现批量转换图片为黑白
2020/06/16 Python
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
前台文员岗位职责及工作流程
2013/11/19 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
旷课检讨书
2015/01/26 职场文书
严以用权学习心得体会
2016/01/12 职场文书
如何做好工作总结!
2019/04/10 职场文书
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android