9

我有一个解析后的 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

>>>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 回答
5
lst = (i[0].rstrip('\x00') for i in List)
for j in lst: 
   print j,
于 2013-04-17T22:59:06.553 回答
2

尝试使用 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'
于 2013-04-17T22:52:59.877 回答
2

您真正想要做的是替换列表中字符串'\x00'中的字符。

为了实现这个目标,人们经常忽略这样一个事实,即在 Python 2 中,非 Unicode 字符串translate()方法也将可选(或仅)删除 8 位字符,如下所示。(它在 Python 3 中不接受此参数,因为默认情况下字符串是 Unicode 对象。)

您的List数据结构似乎有点奇怪,因为它是一个由单个字符串组成的单元素列表的列表。无论如何,在下面的代码中,我已经重命名了它,因为根据PEP 8 - Python 代码的样式指南,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
于 2013-04-18T00:55:40.670 回答
1

我认为解决此特定问题的更好方法是使用以下功能:

import string

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

这不仅会删除 \x00 ,还会删除附加到字符串的任何其他此类十六进制值。

于 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 回答