奇怪的pythonstrip先看现象吧排查和原因延申

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」 最近解析一个接口请求,有时候能成功,有时候就失败,关注点一直在产品给我提供的接口是不是有问题,他们是不是又悄悄改了东西,因为产品很不稳定,也不是必现,就花了今天一上午,终于debug到了问题所在,没想到是python的strip函数在捣鬼

先看现象吧

我想获取input标签 value属性的值
text = 'value="vrQzyLaHwrWiNdeW-hcgW-JovDCXoWhvtNA_wisDg47T5FWM9-mL_cVZ4fe_RWEzsgbTVvLOXDXFp2uzXi6z1w==">'
然后我用python的lstrip和rstrip方法去除value="和">
但当我执行之后,并没有得到我想要的,结果是这样,跟预期的相比多去除了一个v
'rQzyLaHwrWiNdeW-hcgW-JovDCXoWhvtNA_wisDg47T5FWM9-mL_cVZ4fe_RWEzsgbTVvLOXDXFp2uzXi6z1w=='

排查和原因

我们想当然的认为,去除匹配的是一个整体字符串,但实际上不是这样的(这是builtin函数,源代码是c实现的,看不到具体实现),通过反复实验发现,也从官方文档看出,参数其实是一个字符集,每次去除字符的时候,都拿字符集里的字符和这个要去除的字符串的开头/结尾比较,如果匹配上就去除,这样不断去循环,直到没有匹配上,结束

我们看几个例子

图片.png
解析:

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, 我就只能看看了

图片.png