"""Pattern regex per il rilevamento L0 (appalti italiani) + pattern di post-boost. _REGEX_L0_RECOGNIZER — 20 PatternRecognizer Presidio per entità procurement. POST_BOOST_PATTERNS — regex di validazione fullmatch (score +0.30 se match). """ import re as _re from presidio_analyzer import Pattern, PatternRecognizer def _r(entity: str, name: str, regex: str, score: float, context: list) -> PatternRecognizer: return PatternRecognizer( supported_entity=entity, supported_language="it", patterns=[Pattern(name, regex, score)], context=context, ) # --------------------------------------------------------------------------- # L0 — PatternRecognizer per gare d'appalto italiane # Il context in PatternRecognizer serve a boostare lo score # quando certe parole chiave sono trovate vicine allo span rilevato dalla regex. # --------------------------------------------------------------------------- _REGEX_L0_RECOGNIZER: list[PatternRecognizer] = [ # CIG – Ordinario (\d{7}[0-9A-F]{3}) · Unico/Smart ([A-Z][0-9A-F]{9}) _r("CIG", "cig", r"\b(?:\d{7}[0-9A-F]{3}|[A-Z][0-9A-F]{9})\b", 0.70, ["CIG", "cig", "Cig", "CIG:", "cig:", "CIG :", "cig :", "codice CIG", "codice cig", "Codice CIG", "codice identificativo gara", "Codice Identificativo Gara", "codice identificativo della gara", "identificativo di gara", "id gara", "ID gara", "ID Gara", "smartcig", "SmartCIG", "smart CIG", "Smart CIG", "lotto CIG", "lotto cig"]), # CUP – struttura CIPE ufficiale (15 char) _r("CUP", "cup", r"\b[A-Z]\d{2}[A-Z][A-Z0-9]{2}\d{6}[A-Z0-9]{3}\b", 0.90, ["CUP", "cup", "Cup", "CUP:", "cup:", "CUP :", "cup :", "codice CUP", "Codice CUP", "codice unico di progetto", "Codice Unico di Progetto", "codice unico progetto", "codice progetto", "monitoraggio investimenti pubblici", "investimento pubblico", "progetto pubblico"]), # REA – sigla provincia + separatore + 4-7 cifre _r("REA", "rea", r"\b[A-Z]{2}[\s\-/\.]\d{4,7}\b", 0.85, ["REA", "rea", "Rea", "REA:", "rea:", "REA :", "REA n.", "n. REA", "n. rea", "n.REA", "registro imprese", "Registro Imprese", "registro delle imprese", "registro economico amministrativo", "CCIAA", "cciaa", "camera di commercio", "Camera di Commercio"]), # Numero Gara ANAC – score basso (richiede context boost) _r("NUMERO_GARA_ANAC", "num_gara", r"\b\d{7,8}\b", 0.60, ["ANAC", "ANAC:", "ANAC :", "anac", "numero gara", "Numero Gara", "n. gara", "N. gara", "N.Gara", "identificativo gara", "Identificativo Gara", "identificativo gara:", "id. gara", "ID gara", "numero identificativo gara", "gara ANAC", "gara n.", "gara n°", "SIMOG", "simog", "identificativo ANAC", "codice ANAC"]), # PEC – domini certificati italiani _r("PEC", "pec", r"\b[\w.\-]+@[\w.\-]*(?:pec|postacert|legalmail|pecmail|" r"sicurezzapostale|registerpec|ticertifica)[\w.\-]*\.\w+\b", 0.90, ["PEC", "pec", "Pec", "PEC:", "pec:", "indirizzo PEC", "posta certificata", "Posta Certificata", "posta elettronica certificata", "p.e.c.", "P.E.C."]), # Matricola INPS – score basso (richiede context boost) _r("MATRICOLA_INPS", "inps", r"(?