python正则实现计算器功能

本文实例为大家分享了python正则实现计算器功能的具体代码,供大家参考,具体内容如下

# -*- coding: utf-8 -*-
# Author  :Gogh
# @Time   :2017/12/4 20:16
# @Email  :361910002@qq.com
import re
def operator_update(formula):
  # 对formula公式进行 去除空字符,更新运算符处理
  formula = formula.replace(" ", "") # 去除空字符
  formula = formula.replace("+-", "-")
  formula = formula.replace("--", "+")
  return formula 

def calc_muldiv(formula_list):
  '''''
  计算公式里面的乘除
  :param formula: 列表
  :return:
  '''
  for index, element in enumerate(formula_list):
    if "*" in element or "/" in element:
      operators = re.findall("[*/]", element)
      calc_list = re.split("[*/]", element)
      num = None
      for i, e in enumerate(calc_list):
        if num:
          if operators[i - 1] == "*":
            num *= float(e)
          elif operators[i - 1] == "/":
            num /= float(e)
        else:
          num = float(e)
      formula_list[index] = num
  return formula_list 

def calc_plumin(operators, num_list):
  '''''
  计算列表数字的加减
  :param operators: 运算符列表
  :param num_list: 进行运算的数字列表
  :return: 返回计算结果
  '''
  num = None
  for i, e in enumerate(num_list):
    if num:
      if operators[i - 1] == "+":
        num += float(e)
      elif operators[i - 1] == "-":
        num -= float(e)
    else:
      num = float(e)
  return num 

def merge(plus_minus_operator, multiply_divide_list):
  '''''
  把列表中这样的形式'2*' '-3*' '5/3*' '4/2'合并到一块
  :param formula_list:
  :return:
  '''
  for index, element in enumerate(multiply_divide_list):
    if element.endswith("*") or element.endswith("/"):
      multiply_divide_list[index] = element + plus_minus_operator[index] + multiply_divide_list[index + 1]
      del multiply_divide_list[index + 1]
      del plus_minus_operator[index]
      return merge(plus_minus_operator, multiply_divide_list)
  return plus_minus_operator, multiply_divide_list 

def bracket_calc(formula):
  '''''
  对括号最内层的formula公式进行计算
  :param formula:
  :return:
  '''
  formula = re.sub("[()]", "", formula) # 去除两边的()
  formula = operator_update(formula)
  plus_minus_operator = re.findall("[+-]", formula) # 列表 '+' '-' 运算符
  multiply_divide_list = re.split("[+-]", formula) # 列表 有'*' '/'
  if multiply_divide_list[0] == "": # multiply_divide_list列表第一个字符为空的话,表示一个数字为负号
    multiply_divide_list[1] = "-" + multiply_divide_list[1]
    del plus_minus_operator[0]
    del multiply_divide_list[0]
  res = merge(plus_minus_operator, multiply_divide_list)
  plus_minus_operator = res[0] # 列表 '+' '-' 运算符 进行合并处理
  multiply_divide_list = res[1]
  plus_minus_list = calc_muldiv(multiply_divide_list) # 生成只进行加减运算的列表
  res = calc_plumin(plus_minus_operator, plus_minus_list)
  return res 

def calculate(formula):
  '''''计算程序主入口, 主要逻辑是先计算拓号里的值,算出来后再算乘除,再算加减'''
  while True:
    formula_depth = re.search("[()]+", formula)
    if formula_depth:
      formula_depth = formula_depth.group()
      res = bracket_calc(formula_depth)
      formula = formula.replace(formula_depth, str(res))
      print("\33[34;1m%s\33[0m" % (formula))
    else:
      res = bracket_calc(formula)
      print("\33[31;1m结果:%s\33[0m" % (res))
      exit() 

if __name__ == '__main__':
  formula = "1 - 2 * ( (60-30 +(-9-2- 5-2*-3-5/3-40*4/2-3/5+6*3) * (-9-2-5-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) -(-4*3)/ (16-3*2) )"
  calculate(formula)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python 简易计算器程序,代码就几行

    代码: 复制代码 代码如下: import os while True: dynamic = input('输入计算表达式:') if dynamic != 'cls': try: result = eval(dynamic) print('计算结果:'+str(result)) except: print('计算表达式输入有误!') else: command = 'cls' os.system(command)

  • python3.5仿微软计算器程序

    本文实例为大家分享了python3.5仿微软计算器的具体代码,供大家参考,具体内容如下 from tkinter import * from math import * root = Tk() root.title("计算器") root.geometry("1200x260+0+0") def come(event): event.widget["background"]= "orange"#event的widget方法,恩

  • Python实现简单的四则运算计算器

    一.算法 1.算法的主要思想就是将一个中缀表达式(Infix expression)转换成便于处理的后缀表达式(Postfix expression),然后借助于栈这个简单的数据结构,计算出表达式的结果. 2.关于如何讲普通的表达式转换成后缀表达式,以及如何处理后缀表达式并计算出结果的具体算法描述不在此叙述了,书上有详细的说明. 二.简易计算器 使用说明 使用该计算器类的简单示例如下: # usage c = Calculator() print('result: {:f}'.formart(c

  • python正则表达式之作业计算器

    作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 一.说明: 有一点bug就是不能计算幂次方,如:'6**6'会报错 该计算器思路: 1.没用使用递归,先找出并计算所有括号里的公式,再计算乘除

  • Python只用40行代码编写的计算器实例

    本文实例讲述了Python只用40行代码编写的计算器.分享给大家供大家参考,具体如下: 效果图: 代码: from tkinter import * reset=True def buttonCallBack(event): global label global reset num=event.widget['text'] if num=='C': label['text']="0" return if num in "=": label['text']=str(

  • 仅用50行代码实现一个Python编写的计算器的教程

     简介 在这篇文章中,我将向大家演示怎样向一个通用计算器一样解析并计算一个四则运算表达式.当我们结束的时候,我们将得到一个可以处理诸如 1+2*-(-3+2)/5.6+3样式的表达式的计算器了.当然,你也可以将它拓展的更为强大. 我本意是想提供一个简单有趣的课程来讲解 语法分析 和 正规语法(编译原理内容).同时,介绍一下PlyPlus,这是一个我断断续续改进了好几年的语法解析 接口.作为这个课程的附加产物,我们最后会得到完全可替代eval()的一个安全的四则运算器. 如果你想在自家的电脑上试试

  • 基于python的Tkinter实现一个简易计算器

    本文实例介绍了基于python的Tkinter实现简易计算器的详细代码,分享给大家供大家参考,具体内容如下 第一种:使用python 的 Tkinter实现一个简易计算器 #coding:utf-8 from Tkinter import * import time root = Tk() def cacl(input_str): if "x" in input_str: ret = input_str.split("x") return int(ret[0]) *

  • python概率计算器实例分析

    本文实例讲述了python概率计算器实现方法.分享给大家供大家参考.具体实现方法如下: from random import randrange #randrange form random module def calc_prob(strengths): """A function that receives an array of two numbers indicating the strength of each party and returns the winne

  • 基于wxpython开发的简单gui计算器实例

    本文实例讲述了基于wxpython开发的简单gui计算器.分享给大家供大家参考.具体如下: # wxCalc1 a simple GUI calculator using wxPython # created with the Boa Constructor which generates all the GUI components # all I had to do is add some code for each button click event # Boa free from: h

  • python3.5 + PyQt5 +Eric6 实现的一个计算器代码

    目前可以实现简单的计算.计算前请重置,设计的时候默认数字是0,学了半天就做出来个这么个结果,bug不少. python3.5 + PyQt5 +Eric6 在windows7 32位系统可以完美运行 计算器,简单学了半天就画个图实现的存在bug,部分按钮还未实现,后续优化. 代码结构如图: jisuan.py import re #匹配整数或小数的乘除法,包括了开头存在减号的情况 mul_div=re.compile("(-?\d+)(\.\d+)?(\*|/)(-?\d+)(\.\d+)?&q

随机推荐