Вычислить математическое выражение из строки — Python

Мне нужно вычислить выражение из заданной строки, например "(19 + ((91 -96)-13))", но я должен сам составить алгоритм, который я не могу использовать eval() или что-то подобное.

Меня много пробовали с этим кодом, но у меня возникают проблемы с отрицательными числами:

while counter < 1:
    chunks = []
    counter2 = 1

    for character in operation:
        if character.isdigit():
            if chunks[-1].isdigit():   # If the last chunk is already a number
                chunks[-1] += character  # Add onto that number
            else:
                chunks.append(character) # Start a new number chunk
        elif character in '+-/*()':
            chunks.append(character)  # This doesn't account for `1 ++ 2`.

    for e in reversed(chunks):
        if e == '(':
            counter2 = len(chunks) - counter2
            break
        else:
            counter2 = counter2 + 1

    if chunks[counter2+2] == '+':
        result2 = int (chunks[counter2+1]) + int (chunks[counter2+3])
    elif chunks[counter2+2] == '-':
        result2 = int (chunks[counter2+1]) - int (chunks[counter2+3])
    elif chunks[counter2+2] == '*':
        result2 = int (chunks[counter2+1]) * int (chunks[counter2+3])
    elif chunks[counter2+2] == '/':
        result2 = int (chunks[counter2+1]) / int (chunks[counter2+3])


    chunks[counter2] = ''
    chunks[counter2 + 1] = ''
    chunks[counter2 + 2] = str (result2)
    chunks[counter2 + 3] = ''
    chunks[counter2 + 4] = ''

    operation = ''.join(chunks)

Не обращайте внимания на условие while, я обновляю его, так как мне нужно просто проверить


person Wrong    schedule 01.04.2016    source источник
comment
Использование подходящего инструмента лексического разбора, такого как PLY или даже Lex/Yacc, сделает вашу жизнь проще. намного проще...   -  person Akshat Mahajan    schedule 01.04.2016
comment
дело в том, что я не могу, я должен сделать весь алгоритм..   -  person Wrong    schedule 01.04.2016
comment
Какие конкретные проблемы с отрицательными числами вы испытываете с этим кодом?   -  person Akshat Mahajan    schedule 01.04.2016
comment
например, если это (-5-6), это не будет сделано правильно, потому что вместо числа будет использоваться «-», я даже получил такие вещи, как (9+-18)   -  person Wrong    schedule 01.04.2016


Ответы (1)


Вы должны попытаться больше отлаживать код самостоятельно. У вас есть проблема в том, что преобразование int выполняется на «-», а не на «-5». Вам нужно объединить "-" и целое число следующим в последовательности и преобразовать это в целое число и использовать. temp = str(фрагменты[счетчик2+3]) + str(фрагменты[счетчик2+4])

person Ashish    schedule 01.04.2016
comment
я как-то исправил это, но теперь это дает странные результаты - person Wrong; 01.04.2016