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 三者原理类似,不一一列举,有兴趣的自己试试。

由此可见,实践出真知,细节藏在魔鬼中,多动手多验证才能熟练掌握。

最后修改于: Monday, February 26, 2024
欢迎关注微信公众号,留言交流。

相关文章:

翻译: