天天看點

《Python Cookbook(第2版)中文版》——1.14 改變多行文本字元串的縮進

本節書摘來自異步社群《python cookbook(第2版)中文版》一書中的第1章,第1.14節,作者[美]alex martelli , anna martelli ravenscrof , david ascher ,高鐵軍 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

任務

有個包含多行文本的字元串,需要建立該字元串的一個拷貝,并在每行行首添加或者删除一些空格,以保證每行的縮進都是指定數目的空格數。

解決方案

字元串對象已經提供了趁手的工具,我們隻需寫個簡單的函數即可滿足需求:

讨論

處理文本的時候,我們常常需要改變一塊文本的縮進。“解決方案”給出的代碼,在多行文本的每行行首增減了空格,這樣每行開頭都有相同的空格數。比如:

即使每行的縮進都截然不同,該函數仍能夠使它們的縮進變得完全一緻,這有時正是我們所需要的,但有時卻不是。一個常見的需求是,調整每行行首的空格數,并確定整塊文本的行之間的相對縮進不發生變化。無論是正向還是反向調整,這都不是難事。不過,反向調整需要檢查一下每行行首的空格,以確定不會把非空格字元截去。是以,我們需要将這個任務分解,用兩個函數來完成轉化,再加上一個計算每行行首空格并傳回一個清單的函數:

所有這些函數都依賴字元串的方法splitlines,它和根據’n’來切分的split很相似。不過splitlines還有額外的好處,它保留了每行末尾的換行符(當你傳入的參數是true的時候)。有時這非常友善:如果splitlines這個字元串方法沒有提供這個能力,addspaces不可能這麼短小精悍。

然後,我們用這些函數組合成另一個函數來删除行首空格。該函數可以在保持各行之間的相對縮進不變的情況下,隻删除它能夠删除的空格,讓縮進最小的行與左端邊界平齊。

更多資料

library reference和python in a nutshell中關于序列類型的部分。