Logga in Publicera
contextetech /

GDPR-skyddsregel: maskera personnummer, telefon och IBAN

v1
Instruktion Målmodell : Allmän (vilken modell som helst) Svenska Licens: MIT Publicerad uppdaterad för 1 timme sedan 0 användningar

GDPR-skyddsregel som maskerar personnummer (med Luhn-kontroll), telefonnummer +46, IBAN SE och privata e-postadresser i en AI-assistents svar. 12 tester.

Regler

Maskera före varje utskick alla uppgifter som identifierar en person eller gör det möjligt att kontakta hen:
- privata e-postadresser (anna.lindgren@…);
- svenska telefonnummer, med eller utan +46;
- svenska IBAN-nummer (SE..);
- personnummer (kontrollsiffran kontrolleras).
Tillåt: allmänna adresser (info@, kundtjanst@, kontakt@…), företagsnamn, belopp, datum, ordernummer.

Testfall

IndataFörväntat
Du kan mejla anna.lindgren@gmail.com för uppdateringar.Blockera
Mitt mobilnummer är 070-174 06 05.Blockera
Ring mig på +46 8 465 004 12 i morgon.Blockera
Överför till SE45 5000 0000 0583 9825 7466.Blockera
Personnummer: 851103-1232.Blockera
Fakturan ska skickas till erik.berg@foretag.se.Blockera
Mejla kundtjanst@contextetech.com om du har frågor.Tillåt
Din order nr 458712 skickas i morgon.Tillåt
Beloppet är 1 250,00 kr inklusive moms.Tillåt
Möte den 2026-10-12 klockan 14.Tillåt
Byggföretaget Nordbygg AB har godkänt offerten.Tillåt
Hej, hur kan jag hjälpa dig?Tillåt

Kod

import re

MONSTER = {
    "epost": r"[\w.+-]+@[\w-]+\.[\w.-]+",
    "telefon": r"(?:\+46[\s.-]?|\b0)(?:7[02369][\s.-]?\d{3}[\s.-]?\d{2}[\s.-]?\d{2}|8[\s.-]?\d{3}[\s.-]?\d{3}[\s.-]?\d{2}|[1-69]\d[\s.-]?\d{3}[\s.-]?\d{2}[\s.-]?\d{2})\b",
    "iban": r"\bSE\d{2}(?:\s?\d{4}){5}\b",
    "personnummer": r"\b(?:\d{2})?\d{6}[-+]\d{4}\b",
}
ALLMANNA = ("info@", "kundtjanst@", "support@", "kontakt@")


def personnummer_giltigt(pnr: str) -> bool:
    """Sista siffran är en kontrollsiffra (Luhn) beräknad på de nio föregående (ÅÅMMDDNNN)."""
    siffror = re.sub(r"\D", "", pnr)[-10:]
    summa = 0
    for i, s in enumerate(siffror[:9]):
        d = int(s) * (2 if i % 2 == 0 else 1)
        summa += d - 9 if d > 9 else d
    return (10 - summa % 10) % 10 == int(siffror[9])


def maskera(text: str) -> tuple[str, bool]:
    """Ersätter personuppgifter med [<typ> maskerad]; returnerar texten och True om något maskerades."""
    hittad = False
    for typ, monster in MONSTER.items():
        def ersatt(m):
            nonlocal hittad
            varde = m.group(0)
            if typ == "epost" and varde.lower().startswith(ALLMANNA):
                return varde
            if typ == "personnummer" and not personnummer_giltigt(varde):
                return varde
            hittad = True
            return f"[{typ} maskerad]"
        text = re.sub(monster, ersatt, text)
    return text, hittad

Gemenskap

Inga kommentarer ännu. Dela din erfarenhet, det hjälper nästa person.