码迷,mamicode.com
首页 > 编程语言 > 详细

3 python实验计算器:加减乘除

时间:2017-12-31 16:42:20      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:格式化   false   err   exce   检查   通过   ace   代码   string   

#--Time    : 2017/12/31 1:25
#--File : day18计算器作业.py
#__author:"cfp"
#date: 2017/12/30
import re
source=‘1+(2*2)/11+3++(2+-2)+2‘


##判断子串是否合法
def check_string(source):
flat = True
if re.search(‘[a-zA-Z]‘,source):
print("无效非法字符!")
flat = False
if source.count("(") != source.count(")"):
print("表达式错误,括号未闭合!")
flat = False
return flat

##将子串格式化
def format_string(source):
source = source.replace(" ","")
source = source.replace("++","+")
source = source.replace("-+","-")
source = source.replace("+-","-")
source = source.replace("/+","/")
source = source.replace("*+","*")
return source

##乘除法函数,一次传入一个()内容
def calc_mul_div(string):
mul_regular = ‘\d+\.?\d*\*\d+\.?\d*‘ ##乘法匹配模式去掉()
div_regular = ‘\d+\.?\d*\/\d+\.?\d*‘ ##乘法匹配模式去掉()

##循环进入条件;当()这个字串有*号的时候
while re.findall(‘\*‘,string):

##一次匹配一组args * args 数据
expression = re.search(mul_regular,string).group()

##计算args * args 这组数据
i,v = expression.split(‘*‘)
mul_result = str(float(i)*float(v))

##将计算后的一组args * args 数据;替换掉args * args
string = string.replace(expression,mul_result)

###将子串在进行格式化下
string = string.format(string)

while re.findall(‘\/‘,string) :
expression = re.search(div_regular,string).group()
i,v = expression.split(‘/‘)
div_result = str(float(i)/float(v))
string = string.replace(expression,div_result)
string = string.format(string)
return string

##加减法函数,一次传入一个()内容
def calc_add_sub(string):
add_sub_regular = ‘\d+\.?\d*\+\d+\.?\d*‘
add_sub1_regular = ‘\d+\.?\d*\-\d+\.?\d*‘
while re.findall(‘\+‘,string):
expression = re.search(add_sub_regular,string).group()
i,v = expression.split(‘+‘)
add_result = str(float(i)+float(v))
string=string.replace(expression,add_result)
string = format_string(string)
while re.findall(‘\-‘,string):
expression1 = re.search(add_sub1_regular, string)
try:
expression1=expression1.group()
except AttributeError:
break
i,v = expression1.split("-")
sub_result = str(float(i)-float(v))
string=string.replace(expression1,sub_result)
string=format_string(string)
return string

##子串通过检查函数进入if语句
if check_string(source):
print("souece:",source)
source = format_string(source)
print("format:",source)

##打印子串通过eval得到数据用于验证,代码的结果是否一致
print(‘eval:‘,eval(source))

##当子串有()的时候进入循环,直到没有()的时候;执行else语句
while re.search(‘\(‘,source):

##匹配最深处的()数据,并传递给加减乘除函数,进行解决()数据
strs_regular = ‘\([^()]+\)‘
strs = re.search(strs_regular,source).group()
strs_result = calc_mul_div(strs)
strs_result = calc_add_sub(strs_result)

##将()的两边( 和)去掉,只保留内容,并替换掉原来传入的()
strs_result = strs_result[1:-1]
source=source.replace(strs,strs_result)
source = format_string(source)
else:
strs_result = calc_mul_div(source)
strs_result = calc_add_sub(strs_result)
source=source.replace(source,strs_result)
source = format_string(source)

print("calculator:",source)



3 python实验计算器:加减乘除

标签:格式化   false   err   exce   检查   通过   ace   代码   string   

原文地址:https://www.cnblogs.com/hero799/p/8157892.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!