【奇怪的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, 我就只能看看了
文章图片
推荐阅读
- 推荐系统论文进阶|CTR预估 论文精读(十一)--Deep Interest Evolution Network(DIEN)
- Python专栏|数据分析的常规流程
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- Python绘制小红花
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- python|8. 文件系统——文件的删除、移动、复制过程以及链接文件
- 爬虫|若想拿下爬虫大单,怎能不会逆向爬虫,价值过万的逆向爬虫教程限时分享
- 分布式|《Python3网络爬虫开发实战(第二版)》内容介绍
- java|微软认真聆听了开源 .NET 开发社区的炮轰( 通过CLI 支持 Hot Reload 功能)