#--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实验计算器:加减乘除
Posted hero799
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3 python实验计算器:加减乘除相关的知识,希望对你有一定的参考价值。
以上是关于3 python实验计算器:加减乘除的主要内容,如果未能解决你的问题,请参考以下文章