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在指定目录下查找gif文件的方法
May 04 Python
python获取mp3文件信息的方法
Jun 15 Python
python使用opencv进行人脸识别
Apr 07 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
python自动生成model文件过程详解
Nov 02 Python
如何运行带参数的python脚本
Nov 15 Python
python 实现视频 图像帧提取
Dec 10 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
python with语句的原理与用法详解
Mar 30 Python
Python子进程subpocess原理及用法解析
Jul 16 Python
Python使用openpyxl批量处理数据
Jun 23 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字符转义相关函数小结(php下的转义字符串)
2007/04/12 PHP
不使用php api函数实现数组的交换排序示例
2014/04/13 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
input 输入框内的输入事件详细分析
2010/03/17 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
获取url中用&隔开的参数实例(分享)
2017/05/28 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
Vue-router的使用和出现空白页,路由对象属性详解
2018/09/03 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
Python MD5加密实例详解
2017/08/02 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
python:动态路由的Flask程序代码
2019/11/22 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
网络维护中文求职信
2014/01/03 职场文书
大学生学业生涯规划
2014/01/05 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
骨干教师事迹材料
2014/12/17 职场文书
食品卫生管理制度
2015/08/06 职场文书
开学第一天的感想
2015/08/10 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL