2013-04-17 21 views
5

Ich habe eine Liste von Werten aus einer geparsten PE-Datei, die/x00 Nullbytes am Ende jedes Abschnitts enthalten. Ich möchte in der Lage sein, die/x00 Bytes aus der Zeichenfolge zu entfernen, ohne alle "x" aus der Datei zu entfernen. Ich habe versucht, .replace und re zu tun, aber nicht welchen Erfolg.Der beste Weg, x00 in Python-Listen zu ersetzen?

Verwendung von Python 2.6.6

Beispiel.

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 

Ich möchte die folgende Ausgabe

Text Daten rsrc

Irgendwelche Ideen auf dem besten Weg, um von über diese gehen?

+4

Verwenden Sie einfach '\ x00', wenn Sie das Nullbyte wirklich entfernen möchten. – nhahtdh

+3

Benennen Sie Ihre Variable nicht nach einem Typ (Liste). Du verlangst Ärger. – timss

+0

PEP8 beiseite, Sie werden nicht in Schwierigkeiten mit 'List' gehen, die sich von' list' unterscheidet (was zu kleinen Fehlern führen könnte). – mgilson

Antwort

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']] 

Oder die Liste an Ort und Stelle zu ändern, anstatt eine neue zu erstellen:

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

Sie müssen keine neuen Listen erstellen oder ersetzen, wo Sie Iteratoren verwenden können. Sie sind frei zu machen. Sie sind buchstäblich Ausdruck der Transformation. –

+0

@LukaRahne Sprechen Sie über Generatorausdrücke? Wie auch immer, dies ist nur ein kleines Beispiel, abhängig von den Bedürfnissen des OP kann er das tun, wenn er will – jamylak

+0

Danke jamjlax, das hat super geklappt. – 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

ein Unicode-Muster Versuchen Sie, wie folgt aus:

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

Es sollte das geben folgende Ergebnisse:

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 

Oder mit Listenkomprehensionen:

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

Eigentlich sollte vor der Zeichenfolge ohne die ‚u‘ arbeiten. Entfernen Sie einfach die ersten drei Hiebe, und verwenden Sie diese als Ihre RegexMuster:

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

Was sind Sie wirklich tun wollen, ist '\x00' Zeichen in Strings in einer Liste zu ersetzen. Um dieses Ziel zu erreichen, wird häufig übersehen, dass in Python 2 die Nicht-Unicode-Zeichenkette translate() auch optional (oder nur) 8-Bit-Zeichen löscht (siehe Abbildung unten). (Dieses Argument wird in Python 3 nicht akzeptiert, da Zeichenfolgen Unicode-Objekte sind.)

Ihre List Datenstruktur scheint ein wenig seltsam, da es sich um eine Liste von Ein-Element-Listen handelt, die nur aus einzelnen Strings bestehen. Unabhängig davon, in dem Code unten habe ich es sections umbenannt, da Großbuchstaben Wörter nur für die Namen der Klassen nach PEP 8 -- Style Guide for Python Code verwendet werden sollten.

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 

Ausgang:

.text 
.data 
.rsrc 
0

Ich denke, eine bessere Art und Weise Pflege dieses besonderen Problems zu nehmen ist die folgende Funktion zu verwenden:

import string 

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

Dies wird nicht nur loszuwerden \ x00, aber alle anderen Hex-Werte, die an Ihre Zeichenfolge angehängt werden.

Verwandte Themen