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中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
Python3.2模拟实现webqq登录
Feb 15 Python
Django添加sitemap的方法示例
Aug 06 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
python 利用已有Ner模型进行数据清洗合并代码
Dec 24 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
pytorch标签转onehot形式实例
Jan 02 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
使用keras实现densenet和Xception的模型融合
May 23 Python
Jupyter notebook 不自动弹出网页的解决方案
May 21 Python
python和anaconda的区别
May 06 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
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
PHP内置加密函数详解
2016/11/20 PHP
PHP实现的策略模式示例
2019/03/20 PHP
javascript 装载iframe子页面,自适应高度
2009/03/20 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
用原生JS获取CLASS对象(很简单实用)
2014/10/15 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
jQuery代码性能优化的10种方法
2016/06/21 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
vue+iview实现分页及查询功能
2020/11/17 Vue.js
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
2014年高二班主任工作总结
2014/12/16 职场文书
失职检讨书大全
2015/01/26 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
房产证明范本
2015/06/19 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript