#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
import re def welcome_func():
"""
输入判断
:param expression: 表达式
:return: 返回有效表达式
"""
welcome_str = "超级计算器"
print(welcome_str.center(50,'*'),'\n') # 输出欢迎界面
while True:
iput = input("请输入你要计算的表达式[q:退出]:").strip()
if iput == 'q': # 退出计算
sys.exit("bye-bye")
elif len(iput) == 0:
continue
else:
iput = re.sub('\s*', '', iput) # 去除空格
return iput def chengchu(expression):
"""
乘除运算
:param expression: 表达式
:return: 返回没有乘除的表达式/最终计算结果
"""
val = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', expression) # 匹配乘除号
if not val: # 乘除号不存在,返回输入的表达式
return expression
data = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', expression).group() # 匹配乘除号
if len(data.split('*')) > 1: # 当可以用乘号分割,证明有乘法运算
part1, part2 = data.split('*') # 以乘号作为分割符
value = float(part1) * float(part2) # 计算乘法
else:
part1, part2 = data.split('/') # 用除号分割
if float(part2) == 0: # 如果分母为0,则退出计算
sys.exit("计算过程中有被除数为0的存在,计算表达式失败!")
value = float(part1) / float(part2) # 计算除法 #print("计算:%s=%s:" % (data,value) )
# 获取第一个匹配到的乘除计算结果value,将value放回原表达式
s1, s2 = re.split('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', expression, 1) # 分割表达式
#print("上一个表达式:",expression)
next_expression = "%s%s%s" % (s1, value, s2) # 将计算结果替换会表达式
#print("下一个表达式%s" % next_expression)
return chengchu(next_expression) # 递归表达式 def jiajian(expression):
"""
加减运算
:param expression: 表达式
:return: 返回没有加减的表达式/最终计算结果
"""
expression = expression.replace('+-','-') # 替换表达式里的所有'+-'
expression = expression.replace('--','+') # 替换表达式里的所有'--'
expression = expression.replace('-+','-') # 替换表达式里的所有'-+'
expression = expression.replace('++','+') # 替换表达式里的所有'++'
#print("处理特殊加减后的表达式:",expression)
data = re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*', expression) # 匹配加减号
if not data: # 如果不存在加减号,则证明表达式已计算完成,返回最终结果
return expression
val = re.search('[\-]?\d+\.*\d*[\+\-]{1}\d+\.*\d*', expression).group()
if len(val.split('+')) > 1: # 以加号分割成功,有加法计算
part1, part2 = val.split('+')
value = float(part1) + float(part2) # 计算加法
elif val.startswith('-'): # 如果是已'-'开头则需要单独计算
part1, part2, part3 = val.split('-')
value = -float(part2) - float(part3) # 计算以负数开头的减法
else:
part1, part2 = val.split('-')
value = float(part1) - float(part2) # 计算减法 s1, s2 = re.split('[\-]?\d+\.*\d*[\+\-]{1}\d+\.*\d*', expression, 1) # 分割表达式
#print("计算%s=%s" % (val,value))
next_expression = "%s%s%s" % (s1, value, s2) # 将计算后的结果替换回表达式,生成下一个表达式
#print("下一个表达式: ",next_expression)
return jiajian(next_expression) # 递归运算表达式 def del_bracket(expression):
"""
小括号去除运算
:param expression: 表达式
:return:
"""
if not re.search(r'\(([^()]+)\)',expression): # 判断小括号,如果不存在小括号,直接调用乘除,加减计算
ret1 = chengchu(expression)
ret2 = jiajian(ret1)
return ret2 # 返回最终计算结果
data = re.search(r'\(([^()]+)\)', expression).group() # 如果有小括号,匹配出优先级最高的小括号
#print("获取表达式",data)
data = data.strip('[\(\)]') # 剔除小括号
ret1 = chengchu(data) # 计算乘除
#print("全部乘除计算完后的表达式:",ret1)
ret2 = jiajian(ret1) # 计算加减
#print("全部加减计算结果:",ret2)
part1, replace_str, part2 = re.split(r'\(([^()]+)\)', expression, 1) # 将小括号计算结果替换回表达式
expression = '%s%s%s' % (part1, ret2, part2) # 生成新的表达式
return del_bracket(expression) # 递归去小括号 if __name__ == "__main__":
try:
expression = welcome_func() # 获取到的表达式
#expression = "-1+ 3 *(-3*2-2/-2+1)/2"
#expression = '1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
reslut = eval(expression) # 用eval计算验证
ret = del_bracket(expression) # 用函数计算后得出的结果
reslut = float(reslut)
ret = float(ret)
if reslut == ret: # 将两种方式计算的结果进行比较,如果相等,则计算正确,输出结果
print("eval计算结果:%s" % reslut)
print("表达式计算结果:%s" % ret)
else: # 两种计算方式的结果不正确,提示异常,并返回两种方式的计算结果
print("计算结果异常,请重新检查!")
print("eval计算结果:%s" % reslut)
print("表达式计算结果:%s" % ret)
except(SyntaxError,ValueError,TypeError): # 如果有不合法输出,则抛出错误
print("输入表达式不合法,请重新检查!")

  

用python的正则表达式实现简单的计算器功能的更多相关文章

  1. JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。

    编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...

  2. python实现简单的计算器功能

    如想实现一个计算器的功能,输入格式为字符串,不能运用python里面的内置方法,出去简单的加减乘除,设计一个相对高级的计算器: a = '1 - 2 * ( ( 6 0 -3 0 +(-40/5) * ...

  3. python根据正则表达式的简单爬虫

    今天根据正则表达式简单的爬了一下大众点评,把北京的美食爬了爬,(店铺名,人均消费,地址) import re import urllib.request from urllib.request imp ...

  4. python模块——re模块(简单的计算器功能实现_eval版)

    #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" # Usage: Make a Diy Calcu ...

  5. 用python语言写一个简单的计算器

    假如我们有这样一个式子: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2 ...

  6. Python入门之实现简单的购物车功能

    Talk is cheap,Let's do this! product_list = [ ['Iphone7 Plus', 6500], ['Iphone8 ', 8200], ['MacBook ...

  7. javascrip 实现简单的计算器功能

    页面样式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  8. js小功能3:一个简单的计算器功能

    html: <input type='text' id='txt1' /> <select id='select'> <option value='+'>+< ...

  9. JS实现一个简单的计算器

    使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择 ...

随机推荐

  1. 微信小程序中的倒计时

    这是我项目中的例子,如果有更好的建议欢迎留言 ,一起学习 //获取时间 var sekillStartTime = resultLis[0].planGroup0.sekillStartTime;// ...

  2. 【原】Coursera—Andrew Ng机器学习—Week 3 习题—Logistic Regression 逻辑回归

    课上习题 [1]线性回归 Answer: D A 特征缩放不起作用,B for all 不对,C zero error不对 [2]概率 Answer:A [3]预测图形 Answer:A 5 - x1 ...

  3. 常用的软件设计模式的Java实现——让编程从野生到飞起

    常用的软件设计模式的Java实现——让编程从野生到飞起_野生技术协会_科技_bilibili_哔哩哔哩  https://www.bilibili.com/video/av7596511/

  4. 201671010127 2016—2017-2 通过一个小程序对Java的再认识。

    学习了将近四周的Java语言,对于Java语言,我也有了更进一步的理解,出于对Java语言的喜爱,我总是喜欢没事的时候,自己敲一些很简单的代码,一边学习Java语言,一边对比C语言,往往可以帮助我们更 ...

  5. 使用clr 调用C#编写的dll中的方法的全解释

    使用clr 调用C#编写的dll中的方法的全解释1.数据库初始化:将下面这段代码直接在运行就可以初始化数据库了exec sp_configure 'show advanced options', '1 ...

  6. webservice CXF 相关面试题

    Web Service的优点(1) 可以让异构的程序相互访问(跨平台)(2) 松耦合(3) 基于标准协议(通用语言,允许其他程序访问) 1:WEB SERVICE名词解释.JSWDL开发包的介绍.JA ...

  7. How to install Freemind 1.0.1 to Ubuntu 14

    安装了Freemind0.9后发现不能打开windows的1.0.1保存的*.mm文件,便对版本开始升级. 1. 从http://freemind.sourceforge.net/wiki/index ...

  8. C/C++ 经典面试题汇总

    面试题1:变量的声明和定义有什么区别 ? 为变量分配地址和存储空间的称为定义,不分配地址的称为声明.一个变量可以在多个地方声明,但是只在一个地方定义.加入extern修饰的是变量的声明,说明此变量将在 ...

  9. PHP防止木马攻击的措施

    防止跳出web目录 只允许你的PHP脚本在web目录里操作,针对Apache,还可以修改httpd.conf文件限制PHP操作路径. 例如:php_admin_value  open_basedir( ...

  10. 《the art of software testing》第四章 测试用例的设计

    白盒测试 逻辑覆盖测试: 逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术.它属白盒测试.白盒测试的测试方法有代码检查法.静态结构分析法.静态质量度量法.逻辑覆盖法.基本路径测试法.域测试.符 ...