1、判断字符串长度、最长的表达式

"""
1、所有数字,计算长度不能超过long
2、如果有多个长度一样,请返回第一个表达式结果
3、数学表达式必须要是最长的,合法的
4、操作符不能是连续的,如 +--+1是不合法的

"""

import re

s = input("请输入字符串:")

#保留只有0-9 +-*字符
list1 = re.findall("[-+*0-9]+",s)
s0 = ""
for s1 in list1:
    lens = 0
    T = True
    for s2 in s1:#判断是否有连续的运算符
        if s2 in ["-","+","*"]:
            lens+=1
            if lens > 1:
                print("不合法表达式:",s1)
                T = False
                break
        else:
            lens = 0
    if T:#求出最长的表达式
        if len(s0)<len(s1):
            s0 = s1

if s0 == "":
    A=0
else:
    if s0[0] == "*":
        s0 = s0[1:]
        if s0.find("*") == 1:
            print("暂时无法计算乘法:",s0)
        else:
            A = eval(s0)
    else:
        if s0.find("*") == 1:
            print("暂时无法计算乘法:", s0)
        else:
            A = eval(s0)
print(A)

  

2、计算器方法--百度的方法

# judgment a char is a operation or not
from pip._vendor.distlib.compat import raw_input


def is_operation(oper):
    if oper == '+' or oper == '-' or oper == '*' or oper == '/':
        return True
    else:
        return False


# split expression
def mixed_operation(exp):
    exp_list = list(exp)
    temp = ''
    behavor_list = []
    i = 0
    length = len(exp_list)
    for item in exp_list:
        if is_operation(item):
            behavor_list.append(int(temp))
            behavor_list.append(item)
            temp = ''
        else:
            temp += item

        if i == length - 1:
            behavor_list.append(int(temp))
            break
        i += 1

    return behavor_list


# cal a o b
def get_aob(a, o, b):
    if o == '+':
        return a + b
    elif o == '-':
        return a - b
    elif o == '*':
        return a * b
    elif o == '/':
        return a / b


# Calculation op1 and op2('*' and '/' or '+' and '-')
def cal_op1_op2(exp_list, op1, op2):
    if len(exp_list) == 1:
        return exp_list

    i = 0
    has_op = False
    for i in range(2, len(exp_list), 2):
        a = exp_list[i - 2]
        o = exp_list[i - 1]
        b = exp_list[i]
        if o == op1 or o == op2:
            has_op = True
            exp_list[i - 2] = get_aob(a, o, b)
            del exp_list[i]
            del exp_list[i - 1]
            break

    if has_op == False:
        return exp_list

    return cal_op1_op2(exp_list, op1, op2)


# cal exp
def cal_exp(exp_list):
    exp_list = cal_op1_op2(exp_list, '*', '/')
    exp_list = cal_op1_op2(exp_list, '+', '-')

    return exp_list[0]

# while True:
expre = input('Enter your expression(0 to end):')
    # if expre == '0':
    #     break

result = mixed_operation(expre)
print('list result = ',result)
print(cal_exp(result))

#print ('END')

  

遗留问题解决方法:

计算器方法里没有判断表达式首字符是运算符情况,加个判断,再使用上计算器方法结合,就能计算合法的最长表达式结果了。

 

2021-1-2,笔记

posted on 2021-01-02 14:58  三天乐趣  阅读(1390)  评论(0编辑  收藏  举报