替换字符串列表中的\x00的最佳方法是什么?

9
我有一个从解析的PE文件中获取的值列表,其中包含每个部分末尾的\x00 null字节。我希望能够从字符串中删除\x00字节,而不是从文件中删除所有"x"。我已经尝试使用.replace()re.sub(),但没有取得很大的成功。
使用Python 2.6.6
示例。
import re

List = [['.text\x00\x00\x00'], ['.data\x00\x00\x00'], ['.rsrc\x00\x00\x00']]

count = 0
while count < len(List):
    test = re.sub('\\\\x00', '', str(List[count]))
    print test
    count += 1

输出:

['.text']
['.data']
['.rsrc']

我希望能获得以下输出:
.text
.data
.rsrc

有什么关于这个问题最好的处理方式吗?

5
如果你真的想要删除空字节,请使用\x00 - nhahtdh
4
不要给你的变量命名为一个类型(如List)。这样做会招来麻烦。 - timss
1
除了PEP8之外,使用List不会有任何问题,它与list是不同的(后者可能会导致微妙的错误)。 - mgilson
2
也许Python解释器不会惩罚你,但你的同事可能会。这是一个很棘手的问题,并且容易导致变量命名不规范。 - timss
如果我没理解错的话,你的代码应该是 str(List[count]) - martineau
显示剩余2条评论
6个回答

15
>>> 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', '')

你不需要创建新的列表或进行替换,可以使用迭代器。它们是免费的。它们实际上是转换表达式。 - Luka Rahne
@LukaRahne您是在谈论生成器表达式吗?不管怎样,这只是一个小例子,根据OP的需要,如果他希望可以这样做。 - jamylak
有没有办法在列表中去掉括号,只获取数据值? 例如 [['.text'],['.data']],如果我想循环遍历索引说 section in sectionlist 然后在下一行放置 section[0],它会给我值 ['text'],但我只想要 .text。怎么做? - user2292661

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

4

尝试使用 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'也可以工作。只需删除前三个斜杠,并将此作为您的正则表达式模式即可:
'\x00'

3
你真正想做的是替换列表中字符串中的'\x00'字符。为了达到这个目标,人们经常忽略 Python 2 中非 Unicode 字符串的 translate() 方法也可以选择(或仅)删除 8 位字符,如下所示。(在 Python 3 中不接受此参数,因为字符串默认为 Unicode 对象。)
你的 List 数据结构似乎有点奇怪,因为它是一个只包含单个字符串的单元素列表的列表。无论如何,在下面的代码中,我将其重命名为 sections,因为根据 PEP 8 -- Style Guide for Python Code,大写字母仅应用于类的名称。
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

2
我认为更好的解决此问题的方法是使用以下函数:
import string

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

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接