Лучший способ заменить \x00 в списках Python?

У меня есть список значений из проанализированного PE-файла, которые содержат нулевые байты /x00 в конце каждого раздела. Я хочу иметь возможность удалить байты /x00 из строки, не удаляя все "x" из файла. Я пытался сделать.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

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

Я хочу получить следующий вывод

текстовые данные rsrc

Есть какие-нибудь идеи о том, как это сделать?

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

Или изменить список вместо создания нового:

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

Попробуйте шаблон Unicode, например так:

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

Это должно дать следующие результаты:

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'

Что вы действительно хотите сделать, это заменить '\x00' символы в строках в списке.

Для достижения этой цели люди часто упускают из виду тот факт, что в Python 2 не-Unicode строка translate() Метод также по желанию (или только) удалит 8-битные символы, как показано ниже. (Он не принимает этот аргумент в Python 3, потому что по умолчанию строки являются объектами Unicode.)

Ваш List структура данных кажется немного странной, так как это список одноэлементных списков, состоящих из одних строк. Несмотря на это, в коде ниже я переименовал его sections Поскольку слова с заглавными буквами должны использоваться только для имен классов в соответствии с PEP 8 - Руководство по стилю для кода Python.

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

Я думаю, что лучший способ решить эту проблему - использовать следующую функцию:

import string

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

Это избавит не только от \x00, но и от любых других шестнадцатеричных значений, добавляемых к вашей строке.

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']
Другие вопросы по тегам