对strip输出的疑惑
最近,在使用strip函数时,发现了一个和预想中相差很多的输出。故写此文来探究strip的用法。
challenge = 'thirty days of pythoonnn'
print(challenge.strip('noth'))
我本以为输出的结果会是’thirty days of pythoonnn’(原因是challenge 并不包含’noth’这个子字符串),结果输出的结果却是:
irty days of py
发现无论是按照子字符串(‘noth’),还是按照拆分后的字符(也就是’n’,‘o’,‘t’,‘h’)去移除原字符串中的内容,都没有办法得到上述的输出。
strip用法简介
strip:用于移除字符串头尾指定的字符(默认为空格)或字符序列。
关于strip的用法,最重要的是理解何为字符串头尾,以及要移除的字符序列。头尾是指的由空格或者是其他分隔符分出来的子字符串,还是指的是首位的两个单个字符?字符序列,是按照子字符串的模式去匹配。还是说会将字符序列的每一个字符都拆分?为了探究上述问题,我们可以通过一些代码来进行测试。
字符串头尾的理解
测试代码:
challenge = 'thirty days of pythoonnn'
print(challenge.strip('t'))
### output
hirty days of pythoonnn
观察输出得知,字符串只移除了原索引为0的‘t’字符。并未移除thirty中的第二个‘t’,也未移除’pythoonnn’中的’t’。
所以可以得出结论,字符串头尾指的就是两边的单个字符。
明确了头尾的概念以后,就有一个新的问题出现了。头尾的字符移除了以后还会接着处理吗,还是说单个字符就只会被移除一次?
测试代码
challenge = 'ttthirty days of pythoonnnttt'
print(challenge.strip('t'))
### output
hirty days of pythoonnn
可以看到开头和末尾的’ttt’都被去除了。由此可以得知字符并不是只会被移除一次,而是会被接着处理,直到遇到第一个非’t’的字符为止。
可以近似的认为去除的过程是:
'ttthirty days of pythoonnnttt'
'tthirty days of pythoonnntt'
'thirty days of pythoonnnt'
'hirty days of pythoonnn'
字符序列的理解
字符序列的匹配模式究竟是拆分后匹配,还是按照子字符串匹配,可以通过下面的代码来进行测试:
challenge = 'thirty days of pythoonnn'
print(challenge.strip('ohtn'))
### output
irty days of py
可以看到,challenge字符串是不包含’ohtn’这个子字符串的,但首尾的’o’,‘h’,‘t’,'n’字符都被移除了。所以可以得出结论,在移除时是按照拆分以后的字符来匹配的,并不是按照整体进行匹配的。
结论
strip 带有参数的时候,这个参数可以理解一个要删除的字符的列表,是否会删除的前提是字符串首尾是否包含要删除的字符,如果有就会继续处理,没有的话是不会删除中间的字符的。
例如
test='aba'
test_strip=test.strip('b')
print(test_strip)
### output
aba
是否修改原字符串
需要注意的是,strip不会改变原始字符串,而是返回一个新的字符串。因此,我们可以安全地使用返回的结果而不会影响原始数据。
test='aba'
test_strip=test.strip('a')
print(test_strip)
### output
b
print(test)
### output
aba
不填参数的情况
strip默认用于移除字符串开头和结尾的空白字符(包括空格、制表符、换行符等)。
test=' Hello World '
print(test.strip())
### output
Hello World
print(test)
Hello World
对比两个输出,可以看出字符串首尾的空格均被移除了。