• 用正则写一个计算器


     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('输入的表达式不合法')
  • 相关阅读:
    课后作业5
    类与对象动手动脑
    动手动脑
    找“水王”
    NABCD
    第七周学习进度
    web网页四则运算
    二维数组最大联通子数组求和
    第六周学习进度
    环状数组最大子数组求和
  • 原文地址:https://www.cnblogs.com/PYlog/p/8919154.html
Copyright © 2020-2023  润新知