使用re开发python计算器
#!/usr/bin/env python
import re
import functools
def minus_operator_handler(formula):
'''处理一些特殊的减号运算'''
minus_operators = re.split("-",formula)
calc_list = re.findall("[0-9]",formula)
if minus_operators[0] == '': # 第一个值肯定是负号
calc_list[0] = '-%s' % calc_list[0]
result = functools.reduce(lambda x,y: float(x) - float(y),calc_list)
print(" - [%s] of result is : " % formula, result )
return result
def handle_minus_in_list(operator_list,calc_list):
'''
有的时候把算术符和值分开后,会出现这种情况 ['-', '-', '-'] [' ', '14969037.996825399 ', ' ', '12.0/ 10.0 ']
这需要把第2个列表中的空格都变成负号并与其后面的值拼起来
'''
for index,item in enumerate(calc_list):
if item == '':
calc_list[index+1] = item + calc_list[index+1].strip()
def compute_mutiply_and_dividend(formula):
'''计算乘除的内容,这里传进来的是字符串'''
# 找出所有带*、/符号的内容
operators = re.findall("[*/]",formula)
# 以*、/为分隔符,取出所有排除掉*、/的内容
calc_list = re.split("[*/]",formula)
# 结果初始化未None
result = None
# 遍历显示数组中的索引号(index)、内容(i)
for index,i in enumerate(calc_list):
if result: # 代表不是第一次循环
if operators[index-1] == "*":
result *= float(i)
elif operators[index-1] == "/":
result /= float(i)
else:
result = float(i)
print("[%s] of result is : " %formula, result)
return result
def handle_special_occactions(plus_and_minus_operators,multiply_and_dividend):
'''有时会出现这种情况 , ['-', '-'] ['1 ', ' 2 * ', '14969036.7968254'],2*...后面这段实际是 2*-14969036.7968254,需要特别处理下'''
# 遍历显示数组multiply_and_dividend中的索引号(index)、内容(i)
for index,i in enumerate(multiply_and_dividend):
# 清除空格、空白
i = i.strip()
# 如果 内容的结尾是*、/
if i.endswith("*") or i.endswith("/"):
multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]
del multiply_and_dividend[index+1]
del plus_and_minus_operators[index]
return plus_and_minus_operators,multiply_and_dividend
def remove_addsubtract(formula):
'''将加减组合的符号替换成合并后的符号'''
formula = formula.replace("++","+")
formula = formula.replace("--","+")
formula = formula.replace("+-","-")
formula = formula.replace("-+","-")
formula = formula.replace("- -","+")
return formula
def compute(formula):
'''这里计算不带括号的内容'''
# 去掉外层的括号
formula = formula.strip("()") # strip是去除的函数
# 将加减组合的符号替换成合并后的符号
formula = remove_addsubtract(formula)
# 找出替换后剩余的所有带+、-符号的内容
plus_and_minus_operators = re.findall("[+-]",formula)
# 以+、-为分隔符,取出所有排除掉+、-的内容,即取出所有*/的内容
multiply_and_dividend = re.split("[+-]",formula)
if len(multiply_and_dividend[0].strip()) == 0: # 代表这肯定是个减号
multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1]
del multiply_and_dividend[0]
del plus_and_minus_operators[0]
plus_and_minus_operators,multiply_and_dividend = handle_special_occactions(plus_and_minus_operators,multiply_and_dividend)
# 遍历显示数组multiply_and_dividend中的索引号(index)、内容(i)
for index,i in enumerate(multiply_and_dividend):
if re.search("[*/]",i):
calc_inside_result = compute_mutiply_and_dividend(i)
multiply_and_dividend[index] = calc_inside_result
'''开始运算+、-'''
print(multiply_and_dividend,plus_and_minus_operators)
total_result = None # 初始化total_result
# 遍历显示数组multiply_and_dividend中的索引号(index)、内容(item)
for index,item in enumerate(multiply_and_dividend):
if total_result: # 代表不是第一次循环
if plus_and_minus_operators[index-1] == "+":
total_result += float(item)
elif plus_and_minus_operators[index-1] == "-":
total_result -= float(item)
else:
total_result = float(item)
print("[%s] of result is : " %formula,total_result)
return total_result
def calc(formula):
'''计算程序主入口, 主要逻辑是先计算括号里的值,算出来后再算乘除,再算加减'''
#给括号的状态设置初始值,假定括号存在
parenthesis_flag = True
#初始化运算结果为None,还没开始运算
calc_result = None
while parenthesis_flag:
#找到最里面一层的括号。正则表达式:()中间没有()的所有字符
inside = re.search("\([^()]*\)",formula)
if inside:
# 先计算括号里面的值
calc_inside_result = compute(inside.group())
formula = formula.replace(inside.group(),str(calc_inside_result))
else:
print('\033[41;1m~~~没括号了~~~\033[0m')
print('The End Result is : ',compute(formula))
# 公式中的括号都被剔除了
parenthesis_flag = False
#程序的入口
if __name__ == '__main__':
result = calc("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) )")
使用re开发python计算器的更多相关文章
- 作业1开发一个简单的python计算器
开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...
- Github Python计算器开源项目 二次开发--增加函数图形
先上原项目链接:https://github.com/xhf79/Calculator_pyqt python+Qt 开发的计算器 原项目界面和功能如图所示: 科学计算的内容基本都有,但按照项目的提示 ...
- Python计算器实操
要求: 开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * ...
- 老男孩python作业5-开发一个简单的python计算器
开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568 ...
- EditPlus开发Python的简单设置
EditPlus是一个功能强大的编辑器,这里介绍用它来开发Python程序所需要的简单设置. 环境:win7 1.设置Python语法缩进: [1]工具-->设置用户自定义工具 [2]在分类面板 ...
- python 计算器的(正则匹配+递归)
经过2天的长时间的战斗,python计算器终于完成了. import re val="1-2*((60-30*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3 ...
- 在Eclipse中手动安装pydev插件,eclipse开发python环境配置
最近在学习Python,因为我是做java的,用惯了eclipse,所以就想用eclipse开发python,但是配置开发环境的时候发现按照网上的配置大多不行,而且都是用的在线安装,很垃圾,没办法,自 ...
- sublime2开发Python的编码问题
在sublime2文本编辑器直接开发python程序会出现错误 Traceback (most recent call last): File ".\sublime_plugin.py&qu ...
- 4.1. 如何在Windows环境下开发Python
4.1. 如何在Windows环境下开发Python 4.1. 如何在Windows环境下开发Python 4.1.1. Python的最原始的开发方式是什么样的 4.1.1.1. 找个文本编辑器,新 ...
随机推荐
- Fiddler模拟自动响应数据
Fiddler模拟自动响应数据 定位到要修改的部分 2.将返回的数据保存到本地,保存成网页,并修改响应数据 找到修改的部分,修改之 3.再次请求刷新首页,将工具定位到autoresponder将接口加 ...
- 浅析nodejs的buffer类(转)
最近翻阅了node v0.10.4的buffer类的源代码,收获不少,也很久没有在cnode上发表文章了,想把一些收获分享给大家,有什么错误的地方希望大牛们指正啊. 前阵子有位rrestjs框架的使用 ...
- Sprite组件和Button组件的使用
一.Sprint组件的使用 1.游戏中显示一张图片,通常我们称之为"精灵" sprite 2.cocos creator如果需要显示一个图片,那么需要在节点上挂一个精灵组件,为这个 ...
- EChart 文字大小调整 饼状图为例
一.EChart图中的文字调整(以饼图为例) 二.源码: { "title": { "text": "", "subtext&qu ...
- vue 父子之间通信及非父子之间通信
直接看图说话 vue Bus总线 import Vue from 'vue';import VueBus from 'vue-bus';Vue.use(VueBus); 这是子组件要发到父组件的写法 ...
- node20180927
1. fs读文件.写文件 // 1 fs读文件 var fs = require('fs') fs.readFile('./20180926 demo/a.text', function (err, ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-10项目各种全局帮助类
本文目录 1. 前沿2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装3.XmlHelper快速操作xml文档4.SerializationHe ...
- Base64 加解密
import java.io.UnsupportedEncodingException; import org.apache.tomcat.util.codec.binary.Base64; /** ...
- chromedriver与chrome版本映射表
问题: 利用selenium调用谷歌浏览器时报错,后发现是由于浏览器与浏览器驱动不匹配造成的 C:\Users\\Desktop\selenium>python chrome.py[9956:6 ...
- SpringBoot使用Sharding-JDBC分库分表
本文介绍SpringBoot使用当当Sharding-JDBC进行分库分表. 1.有关Sharding-JDBC 有关Sharding-JDBC介绍这里就不在多说,之前Sharding-JDBC是当当 ...