[转载] python中replace的小坑 - replace
参考链接: Python中的Inplace运算符| 1(iadd(),isub(),iconcat()…)
对于普通撸码的同学踩到小坑的几率不高,但对于在上位机或者和16进制二进制打交道比较多的同学可能会遇到。
比如一段报文AC260000394A5D,每一段特定长度对应的内容都要解析出来,当对这段报文进行解析翻译的时候,可能会用到replace将已经解析过的部分过滤掉。
举个例子,如果在协议规定下这段报文的解析正确应该如下:
内容是ac26,长度是4,第二个报文内容是00,长度是2,第三个是0039,长度是4,第四个是4a长度是2,最后一个是5d,长度是2。
那将这段报文套用协议翻译的话,可以用按长度顺序截取的方法,这个时候就会用到replace
result=[]
message='AC260000394A5D'
messageLen=[4,2,4,2,2]
for i in range(len(messageLen)):
result.append(message[:messageLen[i]])
message=message.replace(message[:messageLen[i]],'')
print(result)
如果不限定replace的次数是1的话,那么我们在提取第二个报文00之后,replace依然会继续替换,将0039的前面两个00也替换掉,报文的提取结果result = ['AC26', '00', '394A', '5D', '']
如图:
我们加上replace限定次数
result=[]
message='AC260000394A5D'
messageLen=[4,2,4,2,2]
for i in range(len(messageLen)):
result.append(message[:messageLen[i]])
message=message.replace(message[:messageLen[i]],'',1) #增加replace限制1次
print(result)
那么最后result=['AC26', '00', '0039', '4A', '5D']
如图:
符合预期。
小坑replace的限定还是比较坑爹