奇怪的python strip

【奇怪的python strip】最近解析一个接口请求,有时候能成功,有时候就失败,关注点一直在产品给我提供的接口是不是有问题,他们是不是又悄悄改了东西,因为产品很不稳定,也不是必现,就花了今天一上午,终于debug到了问题所在,没想到是python的strip函数在捣鬼
先看现象吧 我想获取input标签 value属性的值
text = 'value="https://www.it610.com/article/vrQzyLaHwrWiNdeW-hcgW-JovDCXoWhvtNA_wisDg47T5FWM9-mL_cVZ4fe_RWEzsgbTVvLOXDXFp2uzXi6z1w==">'
然后我用python的lstrip和rstrip方法去除value="https://www.it610.com/article/和">
但当我执行之后,并没有得到我想要的,结果是这样,跟预期的相比多去除了一个v
'rQzyLaHwrWiNdeW-hcgW-JovDCXoWhvtNA_wisDg47T5FWM9-mL_cVZ4fe_RWEzsgbTVvLOXDXFp2uzXi6z1w=='
排查和原因 我们想当然的认为,去除匹配的是一个整体字符串,但实际上不是这样的(这是builtin函数,源代码是c实现的,看不到具体实现),通过反复实验发现,也从官方文档看出,参数其实是一个字符集,每次去除字符的时候,都拿字符集里的字符和这个要去除的字符串的开头/结尾比较,如果匹配上就去除,这样不断去循环,直到没有匹配上,结束
我们看几个例子
解析:
str= 'value""aluev'
strip_char_set = 'value"'
用的lstrip方法,从左边去除
循环str, 从左边开始遍历:
(1) v在字符集strip_char_set, 去除v,这一步结果是'alue""aluev'
(2) a在字符集strip_char_set, 去除v,这一步结果是'lue""aluev'
依次,最后结果就是一个空字符串
再看这个
'Arthur: three!'.lstrip('Arthur: ')
结果是'ee!'
解析:
str= 'Arthur: three!'
strip_char_set = 'Arthur: '
用的lstrip方法,从左边去除
循环str, 从左边开始遍历:
(1)A在字符集strip_char_set, 去除v,这一步结果是'rthur: three!'
(2)r在字符集strip_char_set, 去除v,这一步结果是'thur: three!'
依次,一直循环到e不在字符集里,循环结束,结果是'ee!'
延申 其实它一点也不奇怪,还是我们学的不精, 想切除整个字符串怎么办呢,除了用正则或其他方式,python3.9新增加了两个函数,可以满足我们的需求,但是我现在因为某些原因,必须要用python3.7, 我就只能看看了
奇怪的python strip
文章图片

    推荐阅读