用正则写一个计算器

 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('输入的表达式不合法')
posted @ 2018-04-23 14:57  人无远虑  阅读(308)  评论(0编辑  收藏  举报