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 获取进程pid号的方法
Mar 10 Python
Python中用Descriptor实现类级属性(Property)详解
Sep 18 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
Python实现XML文件解析的示例代码
Feb 05 Python
python判断设备是否联网的方法
Jun 29 Python
Python中 map()函数的用法详解
Jul 10 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
python 寻找离散序列极值点的方法
Jul 10 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
python能自学吗
Jun 18 Python
Python各协议下socket黏包问题原理
Apr 12 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采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
Javascript浅谈之引用类型
2013/12/18 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
python分割文件的常用方法
2014/11/01 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python全局变量用法实例分析
2016/07/19 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Python实现图片转字符画的示例代码
2017/08/21 Python
python3.7.0的安装步骤
2018/08/27 Python
python实现flappy bird小游戏
2018/12/24 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
如何完美的建立一个python项目
2020/10/09 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
21岁生日感言
2014/02/27 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
校园标语大全
2014/06/19 职场文书
个人自查自纠材料
2014/10/14 职场文书
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技
css3 文字断裂效果
2022/04/22 HTML / CSS