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实现人人网登录示例分享
Jan 19 Python
详解Python中的正则表达式的用法
Apr 09 Python
Python定时执行之Timer用法示例
May 27 Python
在Python的Flask框架中验证注册用户的Email的方法
Sep 02 Python
Python中turtle作图示例
Nov 15 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
Django中密码的加密、验密、解密操作
Dec 19 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 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
第二节--PHP5 的对象模型
2006/11/16 PHP
记录mysql性能查询过程的使用方法
2013/05/02 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
理解JavaScript中的事件
2006/09/23 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
玩转方法:call和apply
2014/05/08 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
JS功能代码集锦
2016/05/04 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
jQuery实现轮播图及其原理详解
2020/04/12 jQuery
详解适配器在JavaScript中的体现
2018/09/28 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
python将每个单词按空格分开并保存到文件中
2018/03/19 Python
python中sys.argv函数精简概括
2018/07/08 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
Python flask框架如何显示图像到web页面
2020/06/03 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
2020/06/11 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
新学期开学寄语
2014/01/18 职场文书
总经理检讨书
2014/09/15 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
离婚案件被告代理词
2015/05/23 职场文书
公司职员入党自传书
2015/06/26 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python