Python中rstrip方法细解
昨天编写 Python 程序批量处理 markdown 文件时,遇到一个 rstrip 方法的使用不当的问题,特此记录下。
问题示例:
1 In [1]: a = "dd.md"
2
3 In [2]: b = a.rstrip(".md")
4
5 In [3]: b
6 Out[3]: ''
仔细看上面的输出,一开始我理解的是 a 去掉后缀.md 后,b 的值该为 dd,实际为空,导致程序功能异常,因为需要处理的 markdown 文件很多,还只有部分文件去除后缀的时候异常,后来查阅文档,才发现理解错误。
strip 这个单词,在英文中用作动词时意思为:
to remove, pull, or tear the covering or outer layer from something 翻译为:除去,剥除,撕掉(外皮或表层)
用作名词时:
高级知识分子给翻译为脱衣舞,信达雅只差一个雅,西方世界有脱衣舞的商业表演。
回归正题,在 python 中,类型 bytes 和 str 都包含 lstrip | strip | rstrip 方法,理解一个,其它的原理类似。
- lstrip 中 l 是 left 左,从左开始处理
- strip 左右开工,去掉包装外壳,回归本原
- rstrip 中 r 是 right,从右开始处理
官方文档解释:
str.rstrip([chars])
rstrip 返回原字符串的副本,移除其中的末尾字符。 chars 参数为指定要移除字符的字符串。 如果省略或为 None,则 chars 参数默认移除空白符(包括空格、换行符、回车符、制表符)。 实际上 chars 参数并非指定单个后缀;而是会移除参数值的所有组合, 关键就是组合这个字眼, 简单说只要命中在 chars 这个组合中的元素,全部按照方向删除,直到不是为止,官方示例:
1 >>> ' spacious '.rstrip()
2 ' spacious'
3 >>> 'mississippi'.rstrip('ipz')
4 'mississ'
不带 chars 参数时,右边的空白符被删除了。
带'ipz'参数时,结尾里面凡是在'ipz'这个集合中的的全删了,和顺序、数量无关,请看我的示例:
1 In [4]: 'mississippi'.rstrip('pzi')
2 Out[4]: 'mississ'
3
4 In [5]: 'mississippi'.rstrip('zip')
5 Out[5]: 'mississ'
6
7 In [6]: 'mississippi'.rstrip('zip')
8 Out[6]: 'mississ'
9
10 In [7]: 'mississippi'.rstrip('izip')
11 Out[7]: 'mississ'
12
13 In [8]: 'mississippi'.rstrip('izzizzzppp')
14 Out[8]: 'mississ'
15
16 In [9]: 'mississipppzzzziii'.rstrip('izzizzzppp')
17 Out[9]: 'mississ'
只要在这个 set(chars)中,精准斩杀,毫不含糊,当然前提是你要杀哪边。
这景象,好比一个机器人杀手拿了一把 stirp 砍刀,有人下达了必须砍掉在 chars 死亡笔记中的人员 🤣😅。
回到文章开头的示例:
1 In [11]: 'dd.md'.rstrip(".md")
2 Out[11]: ''
刚好 '.', 'd', 'm'都在死亡名单中,片甲不留,最后值为空。
问题来了,如只是简单要删除单个后缀,而不是全部给定集合中的字符,那么请使用 str.removesuffix() 方法。
- 官方示例:
1 >>> 'Monty Python'.rstrip(' Python')
2 'M'
3 >>> 'Monty Python'.removesuffix(' Python')
4 'Monty'
- 我的示例
1 In [13]: 'dd.md'.removesuffix(".md")
2 Out[13]: 'dd'
3
4 In [14]: 'helloword.txt'.removesuffix(".txt")
5 Out[14]: 'helloword'
对应的,removeprefix 方法将删除单个前缀字符串,而不是全部给定集合中的字符:
- 示例,删除电话号码前面的Tel:
1 In [16]: 'Tel:086-13110119120'.removeprefix("Tel:")
2 Out[16]: '086-13110119120'
本文只是以 rstrip 为例子,其实触类旁通,lstrip,strip,lstrip 三者原理类似,不一一列举,有兴趣的自己试试。
由此可见,实践出真知,细节藏在魔鬼中,多动手多验证才能熟练掌握。
版权申明:
- 未标注来源的内容全部为原创,未经授权请勿转载(因转载后排版往往错乱、内容不可控、无法持续更新等);
- 非营利为目的,演绎本博客任何内容,请以'原文出处'或者'参考链接'等方式给出本站相关网页地址(方便读者)。