EN
Sign in Publish
contextetech /

Garde-fou RGPD : masquer les données personnelles

v1
Target model : General (any model) French License: MIT Published on updated yesterday 0 uses

Garde-fou RGPD : masque e-mails, téléphones, IBAN et numéros de sécurité sociale français dans les réponses d'un assistant IA. Règles, 12 cas de test, code.

Rules

Masquer avant l'envoi toute donnée permettant d'identifier ou de contacter une personne :
- adresse e-mail nominative (jean.dupont@…) ;
- numéro de téléphone français ;
- IBAN ;
- numéro de sécurité sociale.
Laisser passer : adresses génériques (contact@, support@…), noms d'entreprises, montants, dates, numéros de commande.

Test cases

InputExpected
Vous pouvez écrire à jean.dupont@gmail.com pour le suivi.Block
Mon numéro est le 06 12 34 56 78.Block
Rappelez-moi au +33 6 12 34 56 78 demain.Block
Virement sur FR76 3000 6000 0112 3456 7890 189.Block
Numéro de sécu : 1 85 05 78 006 084 36.Block
Envoyez la facture à marie.martin@entreprise.fr.Block
Écrivez à contact@contextetech.com pour toute question.Allow
Votre commande n° 458712 part demain.Allow
Le montant est de 1 250,00 € TTC.Allow
Rendez-vous le 12/10/2026 à 14 h.Allow
La société Dupont SARL a validé le devis.Allow
Bonjour, comment puis-je vous aider ?Allow

Code

import re

MOTIFS = {
    "email": r"[\w.+-]+@[\w-]+\.[\w.-]+",
    "telephone": r"(?:\+33\s?|0)[1-9](?:[\s.-]?\d{2}){4}",
    "iban": r"\bFR\d{2}(?:\s?[\dA-Z]{4}){5}\s?[\dA-Z]{3}\b",
    "secu": r"\b[12]\s?\d{2}\s?(?:0[1-9]|1[0-2])\s?(?:\d{2}|2[AB])\s?\d{3}\s?\d{3}\s?\d{2}\b",
}
GENERIQUES = ("contact@", "support@", "info@", "hello@")

def masquer(texte: str) -> tuple[str, bool]:
    """Remplace les données personnelles par [masqué] ; renvoie le texte et True si quelque chose a été masqué."""
    trouve = False
    for nom, motif in MOTIFS.items():
        def remplacer(m):
            nonlocal trouve
            if nom == "email" and m.group(0).lower().startswith(GENERIQUES):
                return m.group(0)
            trouve = True
            return f"[{nom} masqué]"
        texte = re.sub(motif, remplacer, texte)
    return texte, trouve

Community

No comments yet. Share your feedback, it will help the next person.