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封装原理与实现方法详解
Aug 28 Python
python实现windows壁纸定期更换功能
Jan 21 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
Python实现多进程的四种方式
Feb 22 Python
如何更优雅地写python代码
Jul 02 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
python 消除 futureWarning问题的解决
Dec 25 Python
Python json转字典字符方法实例解析
Apr 13 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
Python random模块的使用示例
Oct 10 Python
python Scrapy框架原理解析
Jan 04 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 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 URL路由类实例
2013/11/12 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
python中遍历文件的3个方法
2014/09/02 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
Python实现矩阵相乘的三种方法小结
2018/07/26 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
使用Python处理BAM的方法
2018/09/28 Python
Python使用pyautocad+openpyxl处理cad文件示例
2019/07/11 Python
python3.7 sys模块的具体使用
2019/07/22 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
python与c语言的语法有哪些不一样的
2020/09/13 Python
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
阿里巴巴的Oracle DBA笔试题答案-SQL tuning类
2016/04/03 面试题
工程造价自荐信
2013/10/09 职场文书
高中毕业生个人自我鉴定
2013/11/24 职场文书
大学本科生的个人自我评价
2013/12/09 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
2016年教师节贺卡寄语
2015/12/04 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS