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 相关文章推荐
python根据文件大小打log日志
Oct 09 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
浅谈python中get pass用法
Mar 19 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
python读取图片的几种方式及图像宽和高的存储顺序
Feb 11 Python
基于python实现查询ip地址来源
Jun 02 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
python实现简单文件读写函数
Feb 25 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常用image图像函数集
2013/06/24 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
php微信开发之百度天气预报
2016/11/18 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
jQuery实现最简单实用的分秒倒计时
2017/02/05 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
原生js通过一行代码实现简易轮播图
2019/06/05 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
python定时器使用示例分享
2014/02/16 Python
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
python实现nao机器人手臂动作控制
2019/04/29 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
揠苗助长教学反思
2014/02/04 职场文书
活动总结报告格式
2014/05/09 职场文书
2015年小学开学寄语
2015/02/27 职场文书
雨中的树观后感
2015/06/03 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
新手初学Java网络编程
2021/07/07 Java/Android