背景

我们都知道 strip 是用来删除首尾字符串的,在做项目的时候发现很多的bug都是这函数的使用不当(理解不正确)造成的,因此有必要深入研究一下

比如:

1
2
"abc2123".strip("123")
Out[4]: 'abc'

本来是想去除尾部的 123 ,期望获取到的结果是 abc2 ,结果把最末尾的 2 也去除了

原理

为什么会这样呢?我们来看看官方的解释:链接

最外侧的前导和末尾 chars 参数值将从字符串中移除。 开头端的字符的移除将在遇到一个未包含于 chars 所指定字符集的字符时停止。 类似的操作也将在结尾端发生。

结合上面的例子,翻译成人话就是,开头或结尾的每个字符,只要出现在 ‘123’ 这个列表中,就会剔除,并不是说匹配 123 这个整体,然后再剔除(这是很多人的误区),后面还说,只要遇到某个字符不包含在 123 里面,就会停止剔除操作,比如下面这个例子:

1
2
"ab1c123".strip("123")
Out[3]: 'ab1c'

可以看到由于 c 阻隔了 1123,所以没有被剔除,lsrtiprstrip 也是一样的原理

解决方案

当你不确定目标字符串具体长什么样的时候,还是推荐使用 replace 或者 正则 re.sub

1
2
"abc2123".replace("123", "")
Out[7]: 'abc2'
1
2
re.sub("123", "", "abc2123")
Out[11]: 'abc2'

sub的参数:pattern, new string, origin string

2022/3/12 更新


去掉指定的任意字符,不会按顺序

1
2
3
s2 = "@#@!@cxs_have_a_big_dick!@#@!#@"
s2.strip('!@#')
>>> 'cxs_have_a_big_dick'