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递归打印某个目录的内容(实例讲解)
Aug 30 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
python中virtualenvwrapper安装与使用
May 20 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
Jun 11 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
使用python turtle画高达
Jan 19 Python
使用Python实现牛顿法求极值
Feb 10 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
Python中and和or如何使用
May 28 Python
如何写python的配置文件
Jun 07 Python
python实现canny边缘检测
Sep 14 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
编写PHP的安全策略
2006/10/09 PHP
用php和MySql来与ODBC数据连接
2006/10/09 PHP
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
PHP中include与require使用方法区别详解
2013/10/19 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
使用cluster 将自己的Node服务器扩展为多线程服务器
2014/11/10 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
JS交换变量的方法
2015/01/21 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
js实现随机点名
2021/01/19 Javascript
[03:11]2014DOTA2国际邀请赛-VG掉入败者组 独家专访357
2014/07/19 DOTA
python多进程中的内存复制(实例讲解)
2018/01/05 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
工作所在部门证明
2014/09/21 职场文书
2015年团支部工作总结
2015/04/03 职场文书
地道战观后感2000字
2015/06/04 职场文书
感恩教师节主题班会
2015/08/12 职场文书
小学生六年级作文之关于感恩
2019/08/16 职场文书
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python