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中for循环详解
Jan 17 Python
python实现自动重启本程序的方法
Jul 09 Python
Python实现Linux的find命令实例分享
Jun 04 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
Mar 19 Python
对python制作自己的数据集实例讲解
Dec 12 Python
Python对象与引用的介绍
Jan 24 Python
Django Rest framework频率原理与限制
Jul 26 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
python使用selenium爬虫知乎的方法示例
Oct 28 Python
python反扒机制的5种解决方法
Feb 06 Python
Python页面加载的等待方式总结
Feb 28 Python
Python中json.load()和json.loads()有哪些区别
Jun 07 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
比较详细PHP生成静态页面教程
2012/01/10 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
javascript 控制弹出窗口
2007/04/10 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
关于redux-saga中take使用方法详解
2018/02/27 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
python实现得到一个给定类的虚函数
2014/09/28 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
简单了解python协程的相关知识
2019/08/31 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
如何客观的进行自我评价
2013/12/17 职场文书
六十大寿答谢词
2014/01/12 职场文书
党员批评与自我批评材料
2014/10/14 职场文书
2014年文秘工作总结
2014/11/25 职场文书
小平小道观后感
2015/06/09 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers