Лучший способ заменить \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']