在python列表中替换\ x00的最佳方法是什么?

时间:2013-04-17 22:38:24

标签: python regex replace

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

关于最佳解决方法的任何想法?

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

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

答案 2 :(得分:2)

您真正想要做的是替换列表中字符串中的'\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

答案 3 :(得分:1)

尝试使用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'

答案 4 :(得分:1)

我认为处理这个特定问题的更好方法是使用以下功能:

import string

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

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

答案 5 :(得分: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']