替换或移除一个空值(python)

0 投票
4 回答
2597 浏览
提问于 2025-04-15 16:06

我想在一个字符串中去掉一个空字节,有时候还想用其他字符替换它。比如:

字符串 = "41 00 36 00 36 00 00 00 57 00 46 00 42 00 41 00 61 00 62 00 73 00 20 00 36 00"

我在想用随机和替换的方法,但替换总是从第一个开始:

replace("00","B",1)

所以这并不是随机的。

任何帮助都非常感谢!

补充:我说的空字节是指00,我之前说错了:

字符串 = "41 00 36 00 36 00 00 00 57 00 46 00 42 00 41 00 61 00 62 00 73 00 20 00 36 00"

谢谢

4 个回答

0

你不能直接在字符串里面替换字节。相反,你应该使用数组来处理这个问题。

import array
s = "4100360036000000570046004200410061006200730020003600"
a = array.array('c',s)
b = array.array('c',"B") # make a one character array containing B
print a
a[6] = b[0]
print b

当然,如果你想用这些字节表示字符的十六进制代码,那么你需要使用hex()和chr()这两个函数来在整数和十六进制字符的字符串之间进行转换。

1

在Python 3.1.1中测试的丑陋代码

import random
s = "a00b00c00d00e00f00g"
s1 = s.split("00")
i = random.randint(1,s.count("00"))
s2 = "00".join(s1[:i])
s3 = "00".join(s1[i:])
print (s2+"EE"+s3)
7

不仅如此,00 绝对不是“空值”,它实际上是一个由两个字符组成的字符串。你似乎默默地假设你的字符串是由每两个十六进制数字组成的小部分构成的,而你进行的任何字符串操作都不会知道你这个小秘密。如果你真的去“替换一个随机的00”,可能会替换成比如“F0”的第二个数字和“03”的第一个数字组合而成的,这可不是你想要的结果!

一个更清晰的做法是,先把你的字符串分割成两个数字一组,这样就能让你不言而喻的假设变得清晰明了:

>>> string = "4100360036000000570046004200410061006200730020003600"
>>> pieces = [string[i:i+2] for i in range(0, len(string), 2)]
>>> pieces
['41', '00', '36', '00', '36', '00', '00', '00', '57', '00', '46', '00', '42', '00', '41', '00', '61', '00', '62', '00', '73', '00', '20', '00', '36', '00']
>>> 

当然,这样可以写得更简洁,但我这里更注重清晰和概念的准确性!-)

接下来,找到所有的 '00':

>>> where0s = [i for i in range(len(pieces)) if pieces[i] == '00']
>>> where0s
[1, 3, 5, 6, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]

(同样,这里也可以写得更紧凑,但这样是最清晰的方式;-).

然后从找到的 '00' 中随机选择一个,要么删除它,要么用比如 'BA' 替换它,然后再把字符串合并起来:

>>> import random
>>> pickone = random.choice(where0s)
>>> pickone
25
>>> # if replacing:
... 
>>> pieces[pickone] = 'BA'
>>> ''.join(pieces)
'41003600360000005700460042004100610062007300200036BA'
>>> # if removing:
... 
>>> del pieces[pickone]
>>> ''.join(pieces)
'41003600360000005700460042004100610062007300200036'
>>> 

如果这确实是你想要执行的操作,但你希望更简洁和快速,而不是这种完全详细的清晰度,我们当然可以继续发展这个想法!

撰写回答