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 相关文章推荐
SQLite3中文编码 Python的实现
Jan 11 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
python如何实现一个刷网页小程序
Nov 27 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
Python对接 xray 和微信实现自动告警
Sep 17 Python
python如何基于redis实现ip代理池
Jan 17 Python
django ORM之values和annotate使用详解
May 19 Python
Django Form常用功能及代码示例
Oct 13 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
python编写函数注意事项总结
Mar 29 Python
python3实现常见的排序算法(示例代码)
Jul 04 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 中文和编码判断代码
2010/05/16 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
2016/10/24 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
Python微信库:itchat的用法详解
2017/08/14 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
python字符串与url编码的转换实例
2018/05/10 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
Django  ORM 练习题及答案
2019/07/19 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
Python读取分割压缩TXT文本文件实例
2020/02/14 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
电子工程求职信
2014/07/17 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
运动会运动员赞词
2015/07/22 职场文书
python Polars库的使用简介
2021/04/21 Python