9

各セクションの最後に /x00 ヌル バイトを含む、解析された PE ファイルからの値のリストがあります。ファイルからすべての「x」を削除せずに、文字列から /x00 バイトを削除できるようにしたいと考えています。.replace と re.sub を試してみましたが、あまり成功しませんでした。

Python 2.6.6 の使用

例。

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

>>>test  (removes x, but I want to keep it) #changed from tet to test
>>>data
>>>rsrc

次の出力を取得したい

テキストデータ rsrc

これについての最善の方法についてのアイデアはありますか?

4

6 に答える 6

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

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

for x in L:
    x[0] = x[0].replace('\x00', '')
于 2013-04-17T22:40:12.310 に答える
2

本当にやりたいことは、リスト'\x00'内の文字列の文字を置き換えることです。

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

あなたのListデータ構造は、単一の文字列だけで構成される 1 つの要素のリストのリストであるため、少し奇妙に見えます。いずれにせよ、以下のコードでは名前を変更しました。大文字の単語は、 PEP 8 -- Style Guide for Python Codesectionsに従ってクラスの名前にのみ使用する必要があるためです。

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
于 2013-04-18T00:55:40.670 に答える
1

この特定の問題を処理するより良い方法は、次の関数を使用することだと思います。

import string

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

これにより、\x00 だけでなく、文字列に追加された他の 16 進値も削除されます。

于 2015-10-08T22:54:30.957 に答える
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']
于 2013-04-17T22:43:36.847 に答える