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实现建立SSH连接的方法
Jun 03 Python
详解Python3中字符串中的数字提取方法
Jan 14 Python
详解django中自定义标签和过滤器
Jul 03 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
pyqt5自定义信号实例解析
Jan 31 Python
python实现归并排序算法
Nov 22 Python
python 读取修改pcap包的例子
Jul 23 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
python多线程实现TCP服务端
Sep 03 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
Mar 11 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 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使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
自动完成JS类(纯JS, Ajax模式)
2009/03/12 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
JavaScript遍历求解数独问题的主要思路小结
2016/06/12 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
java直接调用python脚本的例子
2014/02/16 Python
python根据路径导入模块的方法
2014/09/30 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
python实现音乐下载器
2018/04/15 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
用python解压分析jar包实例
2020/01/16 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
预备党员思想汇报范文
2014/01/11 职场文书
给客户的道歉信
2014/01/13 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
计划生育证明书写要求
2014/09/17 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
2014年技术部工作总结
2014/12/12 职场文书
学校教师培训工作总结
2015/10/14 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书