我有一个解析后的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
关于最佳解决方法的任何想法?
答案 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']