import re
def _strip_thousand_sep(s: str) -> str:
# 1,000 -> 1000;只删数字之间、后面正好 3 位的逗号
return re.sub(r"(?<=\d),(?=\d{3}(?!\d))", "", s)
def find_unsupported_numbers(answer: str, context: str) -> list[str]:
ctx = {float(t) for t in re.findall(r"-?\d+(?:\.\d+)?", _strip_thousand_sep(context))}
seen, out = set(), []
for tok in re.findall(r"-?\d+(?:\.\d+)?", _strip_thousand_sep(answer)):
val = float(tok)
if val not in ctx and val not in seen:
seen.add(val)
out.append(tok)
return out
import re
from decimal import Decimal
NUM_RE = re.compile(r"(?<![\w.,])(-?(?:\d{1,3}(?:,\d{3})+|\d+(?:\.\d+)?))(?![\w])")
def _norm(tok: str) -> Decimal:
return Decimal(tok.replace(",", ""))
def find_unsupported_numbers(answer: str, context: str) -> list[str]:
ctx = {_norm(t) for t in NUM_RE.findall(context)}
first = {} # setdefault:保序,且保留首次出现的原始写法
for tok in NUM_RE.findall(answer):
first.setdefault(_norm(tok), tok)
return [tok for v, tok in first.items() if v not in ctx]