原作者 Kyle Stratis Oct 01, 2018
目錄
字符串拆分
無參數(shù)字符串拆分
指定分隔符
使用 Maxsplit 對拆分進(jìn)行限定
字符串的連接及拼接
使用運算符 + 進(jìn)行字符串連接
使用 .Join 進(jìn)行字符串連接
合在一起來嘗試
生活中總有幾樣注定的事:死亡、稅單以及需要處理字符串的程序員。 字符串可以有多種形式。 它們可以是非結(jié)構(gòu)化的文本,用戶名,產(chǎn)品描述,數(shù)據(jù)庫列表名,或者其它任何我們使用語言描述的內(nèi)容。
既然字符串?dāng)?shù)據(jù)幾乎無處不在,那么掌握所使用的工具如何進(jìn)行字符串處理是非常重要的。 幸運的是,與其它語言甚至舊版本的Python語言相比,Python語言對字符串的操作非常簡單。
您將從本文中學(xué)習(xí)一些最基本的字符串操作:拆分,連接和拼接。 您不僅將學(xué)習(xí)如何使用這些工具,而且還將深入了解它們是如何工作。
字符串拆分
Python語言中,字符串是以str對象的形式表示的,是不可變的:這意味著不能直接更改內(nèi)存中的對象。 記住這兩個特點將會幫助您學(xué)習(xí)(并且記?。┤绾问褂?split。
您猜到字符串的這兩個特征是如何與Python語言中的拆分功能相關(guān)的嗎?如果您猜的到 因為字符串是一種特殊類型,所以.split是一個實例方法,那么您就是正確的!在其它一些語言(如Perl)中,是將原始字符串用作獨立的.split函數(shù)的輸入,而不是使用方法調(diào)用字符串本身。
注意:如何調(diào)用字符串方法
這里顯示的 .split這種寫法就是對字符串實例進(jìn)行調(diào)用的方法。 可稱之為為靜態(tài)方法,但這并不理想的形式,因為它比較“冗長”。為了完整起見,舉個例子:
與下面首選的方法一比較,就會覺得上面的寫法顯得有些笨拙了:
有關(guān)Python語言中的實例、類和靜態(tài)方法的更多內(nèi)容,請查看我們的Python深入教程。
字符串不可變會怎樣? 這其實是提醒您字符串方法不支持就地操作,但它們會在內(nèi)存中返回一個新對象。
注意:就地操作
就地操作是直接更改被調(diào)用的對象的操作。 常見的例子是對列表使用的.append方法:當(dāng)您對列表使用.append函數(shù)時,原列表會被更改,原列表中填加了.append的輸入。
無參數(shù)字符串拆分
在深入學(xué)習(xí)字符串拆分之前,先看一個簡單的例子:
Python 代碼:
輸出結(jié)果:
這實際上是.split調(diào)用的一個特例,就是因為簡單,所以我選了它做例子。如果不指定任何分隔符,.split會使用空格做為分隔符。
這種不帶參數(shù)直接調(diào)用.split的另一個特性是它會自動刪除字符串前導(dǎo)、尾隨以及連續(xù)的空格。 比較一下對下面的字符串調(diào)用split時,不使用分割符和使用' '(空格)作為分割符時的結(jié)果:
Python 代碼:
結(jié)果:
Python 代碼:
結(jié)果:
首先要注意的是,這個例子反映了Python語言中字符串的不可改變性:后面調(diào)用.split時是對原始字符串進(jìn)行操作,而不是對第一次調(diào)用.split后生成的列表進(jìn)行操作。
第二個你應(yīng)該注意到的是,無參數(shù)調(diào)用.split會提取句子中的單詞并丟棄任何空格。
指定分隔符
.split(' ')的結(jié)果很直觀。 當(dāng)有前導(dǎo)或尾隨分隔符時,您將得到一個空字符串,這可以在結(jié)果列表的第一個和最后一個元素中看到。
當(dāng)有多個連續(xù)的分隔符(例如“this”和“is”之間以及“is”和“my”之間的多個空格),第一個將用作分隔符,后續(xù)的分隔符將進(jìn)入結(jié)果列表 作為空字符串。
注意:調(diào)用.split時的分隔符
雖然上面的示例使用單個空格字符作為.split的分隔符,但并沒有限制您使用的分隔符的類型或字符串長度。 唯一的要求是您的分隔符是一個字符串。 你可以使用從“...”到“separator”等任何東西。
使用Maxsplit對拆分進(jìn)行限定
.split有一個名為maxsplit的可選參數(shù)。 默認(rèn)情況下,.split將在調(diào)用時進(jìn)行所有可能的拆分。 但是,如果對maxsplit賦值后,只會生成指定數(shù)量的拆分。 用我們之前的示例字符串,可以看到maxsplit的運行情況:
Python 代碼:
運行結(jié)果:
如上所示,如果將maxsplit設(shè)置為1,則第一個空白區(qū)域?qū)⒆鳛榉指舴溆嗟牟糠謱⒈缓雎浴?讓我們做一些練習(xí)來測試一下到目前為止所學(xué)的一切。
練習(xí): “ 自己試試看: Maxsplit”
如果對maxsplit賦一個負(fù)數(shù),結(jié)果會是怎樣?
答案: “ 自己試試看: Maxsplit”
.split 將對所有的分隔符上進(jìn)行字符串拆分,這和不設(shè)置Maxsplit參數(shù)時的缺省設(shè)置是一樣的。
練習(xí): “章節(jié)理解檢查”
您最近拿到了一個逗號分隔(CSV)的文件,但是其格式編排的大有問題。 您的任務(wù)是將每行提取到一個列表中,該列表的每個元素代表該文件的列。 這個文件的格式有什么問題呢? 其中的“Address”字段中包含了多個逗號,但實際上需要在列表中表示為單個元素!
假定讀入到內(nèi)存中的文件是下面這樣的多段字符串:
CSV文件:
希望的輸出結(jié)果應(yīng)該是這樣的由列表組成的列表
Python輸出:
內(nèi)層的列表是我們關(guān)心的CSV文件的列元素,每一個內(nèi)層的列表是CSV文件的一行,外層的列表把所有的行組合起來。
答案: “章節(jié)理解檢查”
這里給出我的答案??梢杂蓭追N方法得到結(jié)果。重要的是如何使用.split,以及使用附加參數(shù)得到希望的結(jié)果:
Python代碼:
我們調(diào)用了兩次.split。第一個調(diào)用可能理解起來有點難,但不要擔(dān)心!我們一步一步看進(jìn)去,您就會對這些表達(dá)式熟悉了。來看看第一個.split調(diào)用吧:unsplit.split(' n')[1:]。
第一個元素是unsplit,是指向輸入字符串的變量。之后就是.split調(diào)用:. split(' n')。這里,我們使用了一個特殊字符 - 換行符 做為分隔符。
是做什么的呢?顧名思義,它指明在讀取字符串的內(nèi)容時,它之后的每個字符都應(yīng)顯示在下一行。像我們使用的input_string這樣的多行字符串中,每行的末尾都有一個隱藏的 n。
這一行最后的部分用法可能有點新:[1:]。這條語句執(zhí)行到這個部分之前會輸出一個新的列表, [1:]看起來像列表索引表示,其實它就是一種列表索引的表示方法!這一行最后額外的索引表示法會為我們輸出一個列表切片。在本例中,我們?nèi)〕鏊饕?以及其后面的所有內(nèi)容,丟棄索引0處的元素。
總之,我們遍歷一個字符串列表,其中每個元素代表多行輸入字符串中除了第一行之外的每一行。
對每一行字符串,我們再次使用.split進(jìn)行字符拆分,但這次我們使用maxsplit僅拆分前兩個逗號,保留地址部分的內(nèi)容原封不動。 之后,我們把結(jié)果添加到已定義的列表數(shù)組中,并返回給調(diào)用者。
字符串的連接及拼接
另一個字符串的基本操作是與拆分字符串相反的操作:字符串連接。 如果您還沒有關(guān)注到這個功能,請不要擔(dān)心。 這只是把字符串“粘在一起”的一種奇特方式。
使用 + 操作符進(jìn)行連接
有幾種方法可以做到這一點,具體取決于您要實現(xiàn)的目標(biāo)。 最簡單和最常用的方法是使用加號(+)將多個字符串添加到一起。 只需在您想要連接的字符串之間放置一個+:
Pyton代碼:
結(jié)果:
和數(shù)學(xué)運算一樣,您還可以將字符串相乘來進(jìn)行字符串重復(fù):
Pyton代碼:
結(jié)果:
請記住,字符串本身是不可改變的! 如果想把字符串連接或重復(fù)的結(jié)果存在變量中,則必須將結(jié)果賦給新的字符串變量進(jìn)行保存。
Pyton代碼:
結(jié)果:
Pyton代碼:
結(jié)果:
Pyton代碼:
結(jié)果:
如果不是不可改變的字符串,則full_sentence會輸出'Hello,world,world'。
另一個需要注意的是Python語言不會進(jìn)行隱式字符串轉(zhuǎn)換。 如果您嘗試將字符串與非字符串類型連接,Python將引發(fā)TypeError:
Pyton代碼:
結(jié)果:
出錯的原因是在Python語言中,您只能將字符串與其他字符串連接起來,這是中您需要注意到的Python語言的特點。如果您使用過諸如JavaScript之類的語言就會知道,這些語言中會嘗試進(jìn)行隱式類型轉(zhuǎn)換。
未完,下篇請看本日推送的第二篇文章
英文原文:https://realpython.com/python-string-split-concatenate-join/
譯者:Xindong