Initialize repository
This commit is contained in:
66
inference/math_eval.py
Normal file
66
inference/math_eval.py
Normal file
@@ -0,0 +1,66 @@
|
||||
"""
|
||||
算式计算模块
|
||||
|
||||
解析并计算验证码中的算式表达式。
|
||||
用正则提取数字和运算符,不使用 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)
|
||||
Reference in New Issue
Block a user