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, August 28, 2023

相關文章:

翻譯: