""" 算式计算模块 解析并计算验证码中的算式表达式。 用正则提取数字和运算符,不使用 eval()。 支持: 加减乘除,个位到两位数运算。 """ import re # 匹配: 数字 运算符 数字 (后面可能跟 =? 等) _EXPR_PATTERN = re.compile( r"(\d+)\s*([+\-×÷xX*])\s*(\d+)" ) # 运算符归一化映射 _OP_MAP = { "+": "+", "-": "-", "×": "×", "÷": "÷", "x": "×", "X": "×", "*": "×", } def eval_captcha_math(expr: str) -> str: """ 解析并计算验证码算式。 支持: 加减乘除,个位到两位数运算。 输入: "3+8=?" 或 "12×3=?" 或 "15-7=?" 或 "3+8" 输出: "11" 或 "36" 或 "8" 用正则提取数字和运算符,不使用 eval()。 Raises: ValueError: 无法解析表达式 """ match = _EXPR_PATTERN.search(expr) if not match: raise ValueError(f"无法解析算式: {expr!r}") a = int(match.group(1)) op_raw = match.group(2) b = int(match.group(3)) op = _OP_MAP.get(op_raw, op_raw) if op == "+": result = a + b elif op == "-": result = a - b elif op == "×": result = a * b elif op == "÷": if b == 0: raise ValueError(f"除数为零: {expr!r}") result = a // b else: raise ValueError(f"不支持的运算符: {op!r} 原式: {expr!r}") return str(result)