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随机生成数据后插入到PostgreSQL
Jul 28 Python
python绘制双柱形图代码实例
Dec 14 Python
Python字典对象实现原理详解
Jul 01 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
详解python opencv、scikit-image和PIL图像处理库比较
Dec 26 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
python函数map()和partial()的知识点总结
May 26 Python
pycharm 关掉syntax检查操作
Jun 09 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 Python
sklearn的predict_proba使用说明
Jun 28 Python
python SOCKET编程基础入门
Feb 27 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循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
文本框水印提示效果的简单实现代码
2014/02/22 Javascript
js实现左侧网页tab滑动门效果代码
2015/09/06 Javascript
js实现全国省份城市级联下拉菜单效果代码
2015/09/07 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
JS遍历树层级关系实现原理解析
2020/08/31 Javascript
python实现html转ubb代码(html2ubb)
2014/07/03 Python
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python中的类与对象之描述符详解
2015/03/27 Python
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
python3+PyQt5实现柱状图
2018/04/24 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
python爬虫工具例举说明
2020/11/30 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
数据员岗位职责
2013/11/19 职场文书
毕业生的求职信范文分享
2013/12/04 职场文书
政风行风评议工作总结
2014/10/21 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
python基础之模块的导入
2021/10/24 Python
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang