[转载] 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的限定还是比较坑爹

你可能感兴趣的:([转载] python中replace的小坑 - replace(‘旧‘,‘新‘,‘次数‘))