import re import ast import operator def safe_eval(expression: str) -> float: """Säkert evaluera matematiska uttryck""" # Tillåtna operatorer operators = { ast.Add: operator.add, ast.Sub: operator.sub, ast.Mult: operator.mul, ast.Div: operator.truediv, ast.Pow: operator.pow, ast.BitXor: operator.xor, ast.USub: operator.neg, } def eval_expr(node): if isinstance(node, ast.Num): return node.n elif isinstance(node, ast.BinOp): return operators[type(node.op)](eval_expr(node.left), eval_expr(node.right)) elif isinstance(node, ast.UnaryOp): return operators[type(node.op)](eval_expr(node.operand)) else: raise TypeError(node) try: return eval_expr(ast.parse(expression, mode='eval').body) except: return None def calculate_math(expression: str) -> str: """Beräkna matematiska uttryck""" try: # Rensa uttrycket clean_expr = re.sub(r'[^0-9+\-*/().\s]', '', expression) result = safe_eval(clean_expr) if result is not None: return str(result) else: return f"Cannot calculate: {expression}" except Exception as e: return f"Math error: {str(e)}"