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 相关文章推荐
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
Python爬虫的两套解析方法和四种爬虫实现过程
Jul 20 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
Python线程之定位与销毁的实现
Feb 17 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
python 动态调用函数实例解析
Oct 21 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
python代数式括号有效性检验示例代码
Oct 04 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 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中strtotime函数使用方法分享
2012/01/10 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
php实现webservice实例
2014/11/06 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
JQuery 常用操作代码
2010/03/14 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
Python实现括号匹配方法详解
2020/02/10 Python
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
自我鉴定范文200字
2013/10/02 职场文书
商务助理求职信范文
2014/04/20 职场文书
干部选拔任用方案
2014/05/26 职场文书
任命书怎么写
2014/06/04 职场文书
企业总经理任命书
2014/06/05 职场文书
安全教育片观后感
2015/06/17 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
JavaScript函数柯里化
2021/11/07 Javascript
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis