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 相关文章推荐
ptyhon实现sitemap生成示例
Mar 30 Python
Python的ORM框架SQLObject入门实例
Apr 28 Python
Python实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
tensorflow实现简单的卷积网络
May 24 Python
Python实现聊天机器人的示例代码
Jul 09 Python
PyCharm在新窗口打开项目的方法
Jan 17 Python
pycharm配置pyqt5-tools开发环境的方法步骤
Feb 11 Python
深入了解Django中间件及其方法
Jul 26 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
python实现自动清理重复文件
Aug 24 Python
如何将numpy二维数组中的np.nan值替换为指定的值
May 14 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 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
动态新闻发布的实现及其技巧
2006/10/09 PHP
php curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
js中哈希表的几种用法总结
2014/01/28 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
javascript每日必学之继承
2016/02/23 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
2019/03/27 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
python获取本机外网ip的方法
2015/04/15 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
python实现用户答题功能
2018/01/17 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
Python第三方库的几种安装方式(小结)
2020/04/03 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
Python实现手势识别
2020/10/21 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
租房合同协议书
2014/04/09 职场文书
法制教育演讲稿
2014/09/10 职场文书
会计稽核岗位职责
2015/04/13 职场文书
士兵突击观后感
2015/06/16 职场文书
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技