用正则写一个计算器
1 import re 2 import sys 3 4 5 def welcome(): 6 print('欢迎使用舍近求远计算器') 7 print('***********************************') 8 input_str_biaodas=input('请输入一个复杂的函数表达式:').strip() 9 while True: 10 if input_str_biaodas == 'q': 11 break 12 elif len(input_str_biaodas)=='0': 13 continue 14 else: 15 input_str_biaodas=re.sub('\s','',input_str_biaodas) 16 return input_str_biaodas 17 18 19 # input_user=welcome() 20 # 21 # print(input_user) 22 23 def chengfu(input_user): 24 val = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', input_user) #百度去大小括号,筛选出乘法 25 if not val: 26 return input_user 27 data = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', input_user).group() 28 if len(data.split("*"))>1: 29 part1,part2 = data.split('*') 30 value = float(part1)*float(part2) 31 else: 32 part1,part2=data.split('/') 33 if float(part2)==0: 34 sys.exit('计算过程出现分母为零,表达式错误') 35 value=float(part1)/float(part2) 36 37 38 s1,s2 =re.split('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*',input_user,1) 39 next_input_user ='%s%s%s'%(s1,value,s2) 40 return chengfu(next_input_user) 41 42 def jiajian(input_user): 43 input_user = input_user.replace('+-',"-") 44 input_user = input_user.replace('++', "+") 45 input_user = input_user.replace('-+', "-") 46 input_user = input_user.replace('++', "+") 47 48 data =re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*',input_user) 49 if not data: 50 return input_user 51 val=re.search('[\-]?\d+\.*\d*[\+\-]{1}\d+\.*\d*',input_user).group() 52 if len(val.split('+'))>1: 53 part1,part2=val.split('+') 54 value = float(part1)+float(part2) 55 elif val.startswith('-'): 56 part1,part2,part3 =val.split('-') 57 value = -float(part2)-float(part3) 58 else: 59 part1,part2 = val.split('-') 60 value=float(part1)-float(part2) 61 62 s1,s2 = re.split('[\-]?\d+\.*\d*[\+\-]{1}\d+\.*\d*', input_user, 1) 63 next_input_user = '%s%s%s'%(s1,value,s2) 64 return jiajian(next_input_user) 65 66 def del_bracket(input_user): 67 if not re.search(r'\(([^()]+)\)',input_user): 68 ret1=chengfu(input_user) 69 ret2=jiajian(ret1) 70 return ret2 71 data=re.search(r'\(([^()]+)\)',input_user).group() 72 data=data.strip('[\(\)]') 73 ret1=chengfu(data) 74 ret2=jiajian(ret1) 75 part1,replace_str,part2=re.split(r'\(([^()]+)\)',input_user,1) 76 input_user='%s%s%s'%(part1,ret2,part2) 77 return del_bracket(input_user) 78 79 if __name__=='__main__': 80 try: 81 input_user=welcome() 82 # expression = "-1+ 3 *(-3*2-2/-2+1)/2" 83 # 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))' 84 reslut=eval(input_user) 85 ret=del_bracket(input_user) 86 reslut=float(reslut) 87 ret=float(ret) 88 if reslut==ret: 89 print('eval计算结果:%s'%reslut) 90 print('表达式计算结果:%s'%ret) 91 else: 92 print('计算结果异常,请重新检查') 93 print('eval计算结果:%s' % reslut) 94 print('表达式计算结果:%s' % ret) 95 except(SyntaxError,ValueError,TypeError): 96 print('输入的表达式不合法')
正则真的看不懂,作业是抄的
import re
import sys
def welcome():
print('欢迎使用舍近求远计算器')
print('***********************************')
input_str_biaodas=input('请输入一个复杂的函数表达式:').strip()
while True:
if input_str_biaodas == 'q':
break
elif len(input_str_biaodas)=='0':
continue
else:
input_str_biaodas=re.sub('\s','',input_str_biaodas)
return input_str_biaodas
# input_user=welcome()
#
# print(input_user)
def chengfu(input_user):
val = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', input_user) #百度去大小括号,筛选出乘法
if not val:
return input_user
data = re.search('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*', input_user).group()
if len(data.split("*"))>1:
part1,part2 = data.split('*')
value = float(part1)*float(part2)
else:
part1,part2=data.split('/')
if float(part2)==0:
sys.exit('计算过程出现分母为零,表达式错误')
value=float(part1)/float(part2)
s1,s2 =re.split('\d+\.*\d*[\*\/]+[\+\-]?\d+\.*\d*',input_user,1)
next_input_user ='%s%s%s'%(s1,value,s2)
return chengfu(next_input_user)
def jiajian(input_user):
input_user = input_user.replace('+-',"-")
input_user = input_user.replace('++', "+")
input_user = input_user.replace('-+', "-")
input_user = input_user.replace('++', "+")
data =re.search('\d+\.*\d*[\+\-]{1}\d+\.*\d*',input_user)
if not data:
return input_user
val=re.search('[\-]?\d+\.*\d*[\+\-]{1}\d+\.*\d*',input_user).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*', input_user, 1)
next_input_user = '%s%s%s'%(s1,value,s2)
return jiajian(next_input_user)
def del_bracket(input_user):
if not re.search(r'\(([^()]+)\)',input_user):
ret1=chengfu(input_user)
ret2=jiajian(ret1)
return ret2
data=re.search(r'\(([^()]+)\)',input_user).group()
data=data.strip('[\(\)]')
ret1=chengfu(data)
ret2=jiajian(ret1)
part1,replace_str,part2=re.split(r'\(([^()]+)\)',input_user,1)
input_user='%s%s%s'%(part1,ret2,part2)
return del_bracket(input_user)
if __name__=='__main__':
try:
input_user=welcome()
# 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(input_user)
ret=del_bracket(input_user)
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('输入的表达式不合法')