in src/lighteval/metrics/utils/extractive_match_utils.py [0:0]
def extract_expr(match: re.Match, timeout_seconds: int) -> tuple[str | sympy.Expr | None, str]:
# First combine the number
groups = match.groupdict()
# Expr group will always exist because every regex has it
expr = groups.get("expr", "")
integer = next((val for name, val in groups.items() if name.startswith("integer") and val), "")
decimal = next((val for name, val in groups.items() if name.startswith("decimal") and val), "")
is_percentage = True if groups.get("percent", None) else False
if integer or decimal:
# This makes sure we can convert numbers like 0001 to 1. Do note that this can convert 0 to '', so we assume an empty string was 0 and convert it back afterwards.
integer = integer.translate(str.maketrans("", "", ", ")).lstrip("0")
if len(integer) == 0:
integer = "0"
decimal = decimal.replace(",", ".")
number_str = f"{integer}{decimal}"
try:
number = Number(number_str)
except Exception:
return None, number_str
if is_percentage:
number = convert_to_pct(number)
return number, number_str
# Otherwise just return the expression
# Remove new lines and spaces
if expr:
try:
return parse_expr_with_timeout(expr.replace("\n", " ").replace("^", "**"), timeout_seconds), expr
except Exception: # noqa: E722
pass
return None, expr