用python的正则表达式实现简单的计算器功能

#!/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("输入表达式不合法,请重新检查!")

  

时间: 2024-10-11 17:54:19

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

使用JS完成一个简单的计算器功能

使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElementById("id").value = 1: 取值:var = document.getElementById("id").value: 任务 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择框的值. 提示:document.getElement

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

#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" # Usage: Make a Diy Calculator # example: # '1 - 2 * ((60-30 +(-40/5) * (9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))' import re RE_RULE = '\([^()]+\)' def arithmetical(temp)

shell实现一个简单的计算器功能小脚本

废话不多说,直接上代码,基本实现加减乘除功能: #!/bin/bash # author by alsww # date : 2016.02.03 # mail : [email protected] # blog : alsww.blog.51cto.com print_info(){     printf "请输入数字:\n" } print_err_num(){     printf "请输入正确的数字!\n" } print_err_fuhao(){    

Python使用正则表达式替换源码前序号

从博客园或其它地方拷贝代码,经常前面有代码序号,像下面这个样子: 1 wbContent.Navigate(vURL); 2  3     Result:=GetHtml(wbContent); 4  5     while not ContainsText(Result,'共找到') do 6     begin 7       Sleep(100); 8       Application.ProcessMessages; 9       Result:=GetHtml(wbContent)

JS实现一个简单的计算器

使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择框的值. 提示:document.getElementById( id名 ).value 获取或设置 id名的值. 第三步: 获取通过下拉框来选择的值来改变加减乘除的运算法则. 提示:使用switch判断运算法则. 第四步:  通过 = 按钮来调用创建的函数,得到结果. 注意: 使用parseInt

教学项目之-通过Python实现简单的计算器

教学项目之-通过Python实现简单的计算器 计算器开发需求 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2

完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input("please input a number:"))except ValueError: print("第一个运算数字输入非数字") try: b=int(raw_input("please input another number:"))except Val

python 中正则表达式

. 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束 代码/语法 说明 * 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次 [aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!). [0-9]代表的含意与\d就是完全一致的:一位数字:同理[a-z0-9A-Z_]也完

python的正则表达式

1.1. 正则表达式的简单介绍 正则表达式并不是python特有的,它在其他编程语言中也有运用到,它不属于任何编程语言,它是独立开来的一种用于处理字符串的强大工具,拥有自己独特的语法. 下面这个图是正则表达式的详细规则 1.2. 正则中的贪婪模式与非贪婪模式 正则表达式通常用于在文本中查找匹配的字符串.Python里当用+?*去匹配的时候默认是贪婪的,总是尝试匹配尽可能多的字符:非贪婪的则相反,总是尝试匹配尽可能少的字符,在+?*后面加个?.例如:正则表达式"xy*"如果用于查找&qu