2013-04-17 14 views
5

私は、各セクションの最後に/ x00のヌルバイトを含む解析されたPEファイルからの値のリストを持っています。私はファイルからすべての "x"を削除せずに文字列から/ x00バイトを削除したいと思っています。私は.replaceとre.subをやってみましたが、どれが成功したかはわかりません。 Pythonの2.6.6Pythonのリストで x00を置き換える最も良い方法は?

例を使用して

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 

私は次のように出力

テキスト データ RSRC

このついて行くの最善の方法上の任意のアイデアを取得したいですか?

+4

実際にヌルバイトを削除する場合は、単に '\ x00'を使用してください。 – nhahtdh

+3

変数に型(List)の後に名前を付けないでください。あなたはトラブルを求めています。 – timss

+0

PEP8を除いて、 'list'とは別の' List'を使っても問題は起こりません(微妙なバグを引き起こす可能性があります)。 – mgilson

答えて

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

またはその代わりに新しいものを作るの代わりにリストを変更するには:

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

それは与えるべきである:

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

イテレータを使用できる新しいリストを作成したり、置換えを行う必要はありません。彼らは自由に作ることができます。それらは文字通り変換式です。 –

+0

@ LukaRahneあなたはジェネレータ表現について話していますか?とにかくこれはほんの少しの例で、OPのニーズに応じて、彼が望むならそれを行うことができます – jamylak

+0

ありがとうjamjlax、それはうまくいきました。 – 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

はこのように、Unicodeのパターンを試してみてください以下の結果:

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 

あるいは、リストの内包表記を使用して:

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

実際には、文字列の前に 'U' せずに動作するはずです。ただ、最初の3つのスラッシュを削除し、あなたの正規表現パターンとしてこれを使用します。

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

は、あなたが本当にやりたいと思っているのは文字列リストの中'\x00'文字を置き換えています。

Python 2では、非Unicode文字列translate()は、以下に示すように8ビット文字をオプションで(または唯一)削除するという事実をよく見落としています。文字列はデフォルトでUnicodeオブジェクトであるため、Python 3ではこの引数は受け入れられません。

ListListデータ構造は、単一の文字列で構成される1要素リストのリストなので、ちょっと奇妙なようです。それにもかかわらず、下のコードでは、PEP 8 -- Style Guide for Python Codeに従ったクラスの名前に対してのみ大文字の単語を使用する必要があるため、sectionsという名前に変更しました。

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 

は出力:

.text 
.data 
.rsrc 
0

私は、この特定の問題の世話をするより良い方法は、以下の機能を使用することであると思う:

import string 

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

これがないだけを取り除くだろう\ x00ではなく、文字列に追加される他の16進値。

関連する問題