Python3.6基于正则实现的计算器示例【无优化简单注释版】


Posted in Python onJune 14, 2018

本文实例讲述了Python3.6基于正则实现的计算器。分享给大家供大家参考,具体如下:

# -*- coding:utf-8 -*-
#!python3
import re
import copy
def my_calc(inside):
  """
  计算括号内的算术式
  :param inside:算术式
  :return:结果
  """
  while True:
    # 1、首先需要把含有优先级最高的*和/找出来
    # 这里有几种情况,(1*1) (1*-1) (-1*1)除法类似(暂时不考虑分母为0的情况)
    # 但是有了正则就方便多了
    search_ret = re.search('(\(-)?\d+(\.\d+)?[*/]-?\d+(\.\d+)?', inside)
    if search_ret is None:
      break
    ret_str = search_ret.group()
    if '(' in ret_str:
      ret_str = ret_str[1:]
    num_list = re.split('[*/]', ret_str)
    operator = re.search('[*/]', ret_str).group()
    calc_ret = 0
    if operator == '*':
      calc_ret = float(num_list[0]) * float(num_list[1])
    elif operator == '/':
      calc_ret = float(num_list[0]) / float(num_list[1])
    inside = inside.replace(ret_str, str(calc_ret))
  # */都运算完以后就可以做+-了
  while True:
    # 2、把含有+-的算术式找出来
    search_ret = re.search('(\(-)?\d+(\.\d+)?[+\-]-?\d+(\.\d+)?', inside)
    if search_ret is None:
      break
    ret_str = search_ret.group()
    if '(' in ret_str:
      ret_str = ret_str[1:]
    tmp_str = copy.copy(ret_str)
    num_1 = re.match('-?\d+(\.\d+)?', tmp_str).group()
    tmp_str = tmp_str.replace(num_1, '')
    operator = tmp_str[0]
    num_2 = tmp_str[1:]
    calc_ret = 0
    if operator == '+':
      calc_ret = float(num_1) + float(num_2)
    elif operator == '-':
      calc_ret = float(num_1) - float(num_2)
    inside = inside.replace(ret_str, str(calc_ret))
  return re.sub('[()]', '', inside)
def format_str(s):
  s = s.replace('--', '+')
  s = s.replace('-+', '-')
  s = s.replace('++', '+')
  s = s.replace('+-', '-')
  if s[0] == '+':
    s = s[1:]
  s = '('+s+')'
  return s
def un_bracket_calc(final_str): # -1*2+3-4/-5
  final_str = format_str(final_str)
  final_str = my_calc(final_str)
  return final_str
def my_math(s): # "((-1-2*-3)/(3-2)+(9*5-89)*(2*3*(3-0)))"
  while True:
    inside_bracket = re.search('[()]+[()]+', s)
    if inside_bracket is None:
      # 括号都算完了,如果还有算术式继续运算
      s = un_bracket_calc(s)
      break
    src_str = inside_bracket.group()
    ret = my_calc(src_str)
    s = s.replace(src_str, ret)
  return s
s_src = "((-1 - 2 * -3) / (3 - 2) + (9 * 5 - 9) * (2 * 3 * (3 - 0))) * -100 + 99-100 * -1-1"
s_src = s_src.replace(' ', '')
print(my_math(s_src))
s_ret = ((-1 - 2 * -3) / (3 - 2) + (9 * 5 - 9) * (2 * 3 * (3 - 0))) * -100 + 99 - 100 * -1 - 1
print(s_ret)

运行结果:

Python3.6基于正则实现的计算器示例【无优化简单注释版】

PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:

在线一元函数(方程)求解计算工具:
http://tools.3water.com/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.3water.com/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.3water.com/jisuanqi/jsq

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
python进阶教程之函数参数的多种传递方法
Aug 30 Python
Python3中多线程编程的队列运作示例
Apr 16 Python
Python爬取国外天气预报网站的方法
Jul 10 Python
Python读写Json涉及到中文的处理方法
Sep 12 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 Python
python实现KNN分类算法
Oct 16 Python
pytorch中图像的数据格式实例
Feb 11 Python
解决python 找不到module的问题
Feb 12 Python
解决Python在导入文件时的FileNotFoundError问题
Apr 10 Python
Django之富文本(获取内容,设置内容方式)
May 21 Python
Python3.6简单反射操作示例
Jun 14 #Python
Python3.6日志Logging模块简单用法示例
Jun 14 #Python
Python实现的knn算法示例
Jun 14 #Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 #Python
Tensorflow 查看变量的值方法
Jun 14 #Python
对Tensorflow中权值和feature map的可视化详解
Jun 14 #Python
TensorFlow的权值更新方法
Jun 14 #Python
You might like
十天学会php之第六天
2006/10/09 PHP
PHP 常用函数库和一些实用小技巧
2009/01/01 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
innerHTML与jquery里的html()区别介绍
2012/10/12 Javascript
javascript加号"+"的二义性说明
2013/03/04 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
node.js实现http服务器与浏览器之间的内容缓存操作示例
2020/02/11 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
Python操作列表的常用方法分享
2014/02/13 Python
python求列表交集的方法汇总
2014/11/10 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
Python如何实现邮件功能
2020/05/27 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
高中三年学习生活的自我评价
2013/10/10 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
民政局个人整改措施
2014/09/24 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
自查自纠工作总结
2014/10/15 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
北京英文导游词
2015/02/12 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server