2017-10-04 4 views
1

J'ai un fichier texte qui me demande de le lire en binaire et d'écrire en binaire. Aucun problème. Je dois masquer les numéros de sécurité sociale avec Xs, assez facile normalement:Python regex un fichier texte de fichier binaire - comment utiliser une gamme de nombres et de limites de mots?

text = re.sub("\\b\d{3}-\d{2}-\{4}\\b","XXX-XX-XXXX", text)

Ceci est un exemple du texte que je suis l'analyse syntaxique:

more stuff here CHILDREN�S 001-02-0003 get rid of that stuff goes here not001-02-0003 but ssn:001-02-0003

et je dois tourner dans ceci:

more stuff here CHILDREN�S XXX-XX-XXXX get rid of that stuff goes here not001-02-0003 but ssn:XXX-XX-XXXX

super! Alors maintenant j'essaye d'écrire cette même regex 'en binaire'. Voici ce que j'ai et il est « fonctionne », mais il ne se sent mince alors pas bien du tout:

line = re.sub(b"\\B(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)\x00-(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)\x00-(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)(\x000|\x001|\x002|\x003|\x004|\x005|\x006|\x007|\x008|\x009)\\B", b"\x00X\x00X\x00X\x00-\x00X\x00X\x00-\x00X\x00X\x00X\x00X", line)

Notes:

  • cette ordure dans CHILDRENS, dois garder comme ça
  • doivent limite de mot, donc la 4ème ligne ne soit pas masqué

ne devrait pas mon regex une gamme de numéros au lieu? Je ne sais pas comment faire cela en binaire. Et mes limites de mots ne fonctionnent que en arrière comme \ B au lieu de \ b, euh .. qu'est-ce qui se passe avec ça?

MISE À JOUR: J'ai aussi essayé ceci:

line = re.sub(b"[\x30-\x39]", b"\x58", line)

et qu'il fait pour chaque numéro, mais si je tente de faire encore quelque chose de simple comme:

line = re.sub(b"[\x30-\x39][\x30-\x39]", b"\x58\x58", line)

ne correspond plus à rien, aucune idée pourquoi?

Répondre

0

Vous pouvez essayer:

import re 

rx = re.compile(r'\b\d{3}-\d{2}-\d{4}\b') 

with open("test.txt", "rb") as fr, open("test2.txt", "wb+") as fp: 
    repl = rx.sub('XXX-XX-XXXX', fr.read()) 
    fp.write(repl) 

Cela permet de maintenir tous les caractères indésirables tels qu'ils sont et les écrit à test2.txt.
Notez que, lorsque vous ne souhaitez pas que toutes les barres obliques inversées s'échappent, vous pouvez utiliser r'string here' dans Python.

+0

Il y a une pile de caractères de type 'cassé' donc j'ai besoin de le traiter comme binaire. Certains sont en UTF-8 mais les gens ont des bobinages bloqués et ce qui ne l'est pas et en raison des besoins de l'entreprise (tuez-moi), j'ai besoin de garder les caractères éclatés et simplement dépouiller les SSN. Si j'opte pour l'encodage UTF-8, je commence à avoir toutes sortes d'erreurs d'encodage. – sniperd

+0

spécifiquement avec la corbeille que je reçois: UnicodeDecodeError: codec 'utf-8' ne peut pas décoder octet 0xff en position 0: octet de démarrage invalide – sniperd

+0

@sniperd: Mis à jour, cela fonctionne pour vous? Je récupère les mêmes caractères indésirables dans 'test2.txt' ici. – Jan