使用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. 找个文本编辑器,新 ...
随机推荐
- ES--08
71.内核原理探秘_最后优化写入流程实现海量磁盘文件合并(segment merge,optimize) 课程大纲 每秒一个segment file,文件过多,而且每次search都要搜索所有的seg ...
- Solidity属性和方法的访问权限
属性:默认是internal的类型,外部是不可以访问调用的,如果加上public的话,那么是会自动为这个属性加上一个get的方法的,比如uint public _age; => functi ...
- Haystack-全文搜索框架
Haystack 1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsear ...
- 原生javascript实现阻止浏览器默认行为与阻止事件冒泡
不同的浏览器之间存在兼容问题,在IE与标准浏览器之间存在很大的差异,所以在实现阻止浏览器默认行为和阻止事件冒泡就要考虑要它们之间的不同 /** * 取消冒泡 * @param {事件} e */ fu ...
- Jmeter性能测试之分布式(五)
Jmeter是纯Java开发的开源性能测试工具, Java程序是很吃内存的, 有时候一台负载机给服务器的压力是不够的, 需要很多台同时负载, 这个时候就需要用到分布式了. 1. 组网图大概就是这样的 ...
- echart 常用配置
mytextStyle={ color:"#333", //文字颜色 fontStyle:"normal", //italic斜体 oblique倾斜 font ...
- Fiddler 抓包设置
手机抓包设置 一:配置Fiddler参数 打开Fiddler菜单项Tools->TelerikFiddler Options->HTTPS, 勾选CaptureHTTPS CONNECTs ...
- php memcached-gui工具
转载: https://github.com/mailopl/memcached-gui/blob/master/memcached.php 适用于在服务端查看memcache内存数据 php代码: ...
- webpack4的总结
1. https://juejin.im/post/5c1fa158f265da613c09cb36
- B. Nirvana Codeforces Round #549 (Div. 2) (递归dfs)
---恢复内容开始--- Kurt reaches nirvana when he finds the product of all the digits of some positive integ ...