2013-04-17 12 views
5

Ho un elenco di valori da un file PE analizzato che include/x00 byte null alla fine di ogni sezione. Voglio essere in grado di rimuovere i byte/x00 dalla stringa senza rimuovere tutte le "x" dal file. Ho provato a fare .replace e re.sub, ma non quale molto successo.Il modo migliore per sostituire x00 nelle liste python?

Utilizzo di Python 2.6.6

Esempio.

import re 

List = [['.text\x00\x00\x00'], ['.data\x00\x00\x00'], ['.rsrc\x00\x00\x00']] 

while count < len(List): 
    test = re.sub('\\\\x00', '', str(list[count]) 
    print test 
    count += 1 

>>>tet (removes x, but I want to keep it) 
>>>data 
>>>rsrc 

voglio ottenere il seguente output

testo dati RSRC

Tutte le idee sul modo migliore di andare su questo?

+4

Basta usare '\ x00' se si desidera veramente rimuovere il byte null. – nhahtdh

+3

Non nominare la variabile dopo un tipo (Elenco). Stai chiedendo guai. – timss

+0

PEP8 a parte, non avrai problemi con l'uso di 'List' che è distinto da' list' (che potrebbe causare bug sottili). – mgilson

risposta

6
>>> L = [['.text\x00\x00\x00'], ['.data\x00\x00\x00'], ['.rsrc\x00\x00\x00']] 
>>> [[x[0]] for x in L] 
[['.text\x00\x00\x00'], ['.data\x00\x00\x00'], ['.rsrc\x00\x00\x00']] 
>>> [[x[0].replace('\x00', '')] for x in L] 
[['.text'], ['.data'], ['.rsrc']] 

O per modificare la lista al posto invece di creare una nuova:

for x in L: 
    x[0] = x[0].replace('\x00', '') 
+0

Non è necessario creare nuovi elenchi o effettuare sostituzioni, in cui è possibile utilizzare gli iteratori. Sono liberi di fare. Sono letteralmente espressione di trasformazione. –

+0

@LukaRahne Stai parlando di espressioni generatrici? Ad ogni modo questo è solo un piccolo esempio, a seconda delle necessità dell'OP se lo può fare se vuole – jamylak

+0

Grazie jamjlax, ha funzionato alla grande. – user2292661

0
from itertools import chain 

List = [['.text\x00\x00\x00'], ['.data\x00\x00\x00'], ['.rsrc\x00\x00\x00']]  
new_list = [x.replace("\x00", "") for x in chain(*List)] 
#['.text', '.data', '.rsrc'] 
0

Prova un modello unicode, in questo modo:

re.sub(u'\x00', '', s) 

Si dovrebbe dare la risultati seguenti:

l = [['.text\x00\x00\x00'], ['.data\x00\x00\x00'], ['.rsrc\x00\x00\x00']] 
for x in l: 
    for s in l: 
     print re.sub(u'\x00', '', s) 
     count += 1 

.text 
.data 
.rsrc 

Oppure, utilizzando list comprehension:

[[re.sub(u'\x00', '', s) for s in x] for x in l] 

In realtà, dovrebbe funzionare senza la 'u' davanti alla stringa. Basta togliere le prime 3 barre, e utilizzare questo come il vostro modello di espressione regolare:

'\x00' 
5
lst = (i[0].rstrip('\x00') for i in List) 
for j in lst: 
    print j, 
1

Quello che stai veramente voglia di fare è sostituire i caratteri '\x00' in stringhe in un elenco.

Per raggiungere questo obiettivo, le persone spesso trascurano il fatto che in Python 2 il metodo non-Unicode translate() opterà anche (o solo) i caratteri a 8 bit come illustrato di seguito. (Non accetta questo argomento in Python 3 perché le stringhe sono oggetti Unicode per impostazione predefinita.)

La struttura dati List sembra un po 'strana, poiché si tratta di un elenco di elenchi di elementi costituiti da singole stringhe. Indipendentemente da ciò, nel codice seguente l'ho rinominato sections poiché le parole in maiuscolo dovrebbero essere utilizzate solo per i nomi delle classi in base allo PEP 8 -- Style Guide for Python Code.

sections = [['.text\x00\x00\x00'], ['.data\x00\x00\x00'], ['.rsrc\x00\x00\x00']] 

for section in sections: 
    test = section[0].translate(None, '\x00') 
    print test 

uscita:

.text 
.data 
.rsrc 
0

Credo che un modo migliore per prendersi cura di questo particolare problema è quello di utilizzare la seguente funzione:

import string 

for item in List: 
    filter(lambda x: x in string.printable, str(item)) 

Questo permetterà di eliminare non solo \ x00 ma qualsiasi altro valore esadecimale aggiunto alla stringa.

Problemi correlati