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环境安装教程
Jul 13 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
Jul 31 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
wxpython实现按钮切换界面的方法
Nov 19 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
使用Python pip怎么升级pip
Aug 11 Python
Pycharm新手使用教程(图文详解)
Sep 17 Python
python解包用法详解
Feb 17 Python
python 标准库原理与用法详解之os.path篇
Oct 24 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脚本的10个技巧(6)
2006/10/09 PHP
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
Jquery调用webService远程访问出错的解决方法
2010/05/21 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python 26进制计算实现方法
2015/05/28 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
用python实现刷点击率的示例代码
2019/02/21 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
2019/06/13 Python
python实现IOU计算案例
2020/04/12 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
个人简历中自我评价
2014/02/11 职场文书
质检部经理岗位职责
2014/02/19 职场文书
会计核算科岗位职责
2014/03/19 职场文书
合作意向书
2014/07/30 职场文书
部队2015年终工作总结
2015/04/02 职场文书
师范生教育见习总结
2015/06/23 职场文书
羊脂球读书笔记
2015/06/30 职场文书
教师远程培训心得体会
2016/01/09 职场文书