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 连连看连接算法
Nov 22 Python
python在linux系统下获取系统内存使用情况的方法
May 11 Python
Python实现数据库编程方法详解
Jun 09 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
在Pandas中给多层索引降级的方法
Nov 16 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
np.random.seed() 的使用详解
Jan 14 Python
Python pip配置国内源的方法
Feb 14 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
使用Python实现批量ping操作方法
May 06 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
python Protobuf定义消息类型知识点讲解
Mar 02 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 文件上传代码(限制jpg文件)
2010/01/05 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
深入理解Javascript里的依赖注入
2014/03/19 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
angularJS实现动态添加,删除div方法
2018/02/27 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
在vue中使用setInterval的方法示例
2019/04/16 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
HTML5里autofocus自动聚焦属性使用介绍
2016/06/22 HTML / CSS
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
会计学个人自荐信模板
2013/12/13 职场文书
网络事业创业计划书范文
2014/01/09 职场文书
《钱学森》听课反思
2014/03/01 职场文书
读书活动实施方案
2014/03/10 职场文书
法学自荐信
2014/06/20 职场文书
公司开业主持词
2015/07/02 职场文书
门面租赁合同范文
2019/08/06 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python