Как удалить лишние скобки из арифметического выражения?

здравствуйте,
такая задача дано арифметическое выражение
например:
((((((((12+24)-56)^29)/52)+29)^90)/12)/62)

необходимо убрать все ненужные скобки и оставить только те что необходимы для вычисления
Выход программы :
((12+24-56)**29/52+29)^90/12/62

мой код почемуто не работает может кто-то поможет понять в чем ошибка ?
def remove_breckets(expression):
    left_pa = -1 #records the position of the left parenthese
    min_op = 0 #records the operator in the parentheses with minimum priority
    left_op = 0 #records current operator
    right_op = 0
    stack = []
    new_exp = ""
    for i in range(len(expression)):
        if expression[i] in operators:
            left_op = expression[i]
            if min_op == 0:
                min_op = expression[i]
            if min_op != 0:
                if prior(min_op) > prior(expression[i]):
                    min_op = expression[i]
            print("left_op", left_op, min_op, "min_op")
        elif expression[i] == "(":
            left_pa = i
            stack.append(left_pa)
        elif expression[i] == ")":
            stack.pop()
            if i != len(expression) - 1:
                if expression[i+1] in operators:
                    right_op = expression[i]
            elif not (min_op <= left_op or min_op < right_op):
                expression[i] = "$"
                expression[left_pa] = "$"
        print(expression[i], "left_op", left_op, "min_op", min_op, "left_pa", left_pa, "right_op", right_op)
    for i in range(len(expression)):
        if expression[i] != "$":
            new_exp += expression[i]
    return new_exp

Заранее спасибо за помощь
  • Вопрос задан
  • 934 просмотра
Пригласить эксперта
Ответы на вопрос 1
adugin
@adugin Куратор тега Python
Несколько читерский способ:
import re

def simplify(expr):
    match = re.match('^(.*?)(\()(.*)(\))(.*?)$', expr)
    if match:
        parts = list(match.groups())
        parts[2] = simplify(parts[2])
        simplified = ''.join(parts[::2])
        if eval(simplified) == eval(expr):
            return simplified
        return ''.join(parts)
    return expr

print(simplify('((((((((12+24)-56)*29)/52)+29)*90)/12)/62)'))

Результат:
((12+24-56)*29/52+29)*90/12/62

Примечания:
1) Есть ограничения по вложенности рекурсии, а также по размеру чисел;
2) Операцию ^ (bitwise XOR) нельзя делать между float и int, поэтому я заменил на умножение;
3) Не работает, если есть несколько уровней одинаковой вложенности (можно доработать);
3) Если охота заморочиться, можно покопаться в модуле ast.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы