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三者原理類似,不一一列舉,有興趣的自己試試。
由此可見,實踐出真知,細節藏在魔鬼中,多動手多驗證才能熟練掌握。
版權申明:
- 未標註來源的內容皆為原創,未經授權請勿轉載(因轉載後排版往往錯亂、內容不可控、無法持續更新等);
- 非營利為目的,演繹本博客任何內容,請以'原文出處'或者'參考鏈接'等方式給出本站相關網頁地址(方便讀者)。