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函数帮助查询小工具
Mar 13 Python
跟老齐学Python之复习if语句
Oct 02 Python
使用Python中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
异步任务队列Celery在Django中的使用方法
Jun 07 Python
Python闭包函数定义与用法分析
Jul 20 Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
python ctypes库2_指定参数类型和返回类型详解
Nov 19 Python
java关于string最常出现的面试题整理
Jan 18 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函数学习之PHP函数点评
2012/07/05 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
jQuery文本框(input textare)事件绑定方法教程
2013/04/24 Javascript
js 鼠标移动显示图片的简单实例
2013/12/25 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
python自动翻译实现方法
2016/05/28 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
python读写文件write和flush的实现方式
2020/02/21 Python
python两个list[]相加的实现方法
2020/09/23 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
EJB实例的生命周期
2016/10/28 面试题
光荣入党自我鉴定
2014/01/22 职场文书
给全校老师的建议书
2014/03/13 职场文书
小学端午节活动方案
2014/03/13 职场文书
个人党性锻炼总结
2015/03/05 职场文书
家长会开场白和结束语
2015/05/29 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
Win11如何修改dns?Win11修改dns图文教程
2022/01/18 数码科技