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 中文字符串的处理实现代码
Oct 25 Python
Python3实现连接SQLite数据库的方法
Aug 23 Python
Python简单实现子网掩码转换的方法
Apr 13 Python
django站点管理详解
Dec 12 Python
scrapy spider的几种爬取方式实例代码
Jan 25 Python
在pandas中一次性删除dataframe的多个列方法
Apr 10 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
详解Python的三种可变参数
May 08 Python
PyTorch的torch.cat用法
Jun 28 Python
通过代码实例了解Python异常本质
Sep 16 Python
python在linux环境下安装skimage的示例代码
Oct 14 Python
python分布式爬虫中消息队列知识点详解
Nov 26 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
详解package.json版本号规则
2019/08/01 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
微信小程序列表时间戳转换实现过程解析
2019/10/12 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
Python代码解决RenderView窗口not found问题
2016/08/28 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
浅谈django channels 路由误导
2020/05/28 Python
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
微观物理专业自荐信
2014/01/26 职场文书
纪律教育学习心得体会
2014/09/02 职场文书
团代会开幕词
2015/01/28 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers