目錄
字符串操作
字符串運算符
字符串內置函數
字符串索引
字符串切片
在字符串切片過程中指定步幅
向字符串中插入變量
修改字符串
字符串內置方法
bytes對象
定義bytes對象字面量
使用內置bytes()函數定義一個bytes對象
bytes對象上的操作
bytearray對象
結論
在Python中的基本數據類型教程中,您學習了如何定義字符串:包含字符數據序列的對象。處理字符數據是編程過程中不可或缺的一部分。至少在某種程度上說,不需要操作字符串的應用非常少見。
以下是您將會在本教程中學習的內容:Python提供了一組豐富的運算符,函數以及方法來處理字符串。完成本教程後,您將會了解如何訪問和提取字符串的部分內容,並熟悉可用於字符串操作和修改的方法。
另外兩個被用來表示原始字節數據的Python對象bytes和bytearray也會在本教程中向您介紹。
字符串操作下面的小節中將會重點介紹可用於處理字符串的運算符,方法和函數。
字符串運算符您已經在Python中的運算符和表達式教程中看到了運算符+和*應用於數值操作數的情況。這兩個運算符同樣也可以應用於字符串。
+運算符+運算符可以把字符串連接起來。它返回一個由操作數連接在一起所組成的字符串,如下所示:
* 運算符創建字符串的多個副本。如果s是一個字符串,n是一個整數,下面任何一種表達式都可以返回一個由n個s的副本所連接而成的字符串:
s * n
n * s
以下是兩種形式的示例:
乘數操作數n必須是一個整數。你也許會認為它必須是一個正整數,但有趣的是,它可以是0或者負數,在這種情況下結果為空字符串。
如果你要創建一個字符串並通過 "foo" * -8 為其賦值將其初始化成為一個空字符串,所有人都會認為你有點蠢。不過這樣做確實是有效的。
in運算符Python還提供了可以與字符串一同使用的成員運算符。如果第一個操作數被第二個操作數包含,那麼in運算符返回True,否則返回Fasle:
此外還有not in運算符,其功能恰好相反:
字符串內置函數正如您在Python中的基本數據類型教程中所看到的一樣,Python提供了許多內置於解釋器並始終可用的函數。下面是一些可以作用於字符串的函數:
函數 描述 chr()將一個整數轉化為一個字符ord()將一個字符轉化為一個整數len()返回一個字符串的長度str()返回一個對象的字符串表示形式下面將會對上述方法進行更詳細的介紹。
對於給定字符返回一個整數值
從最基礎的層面來說,計算機將所有的信息用數字形式存儲。為了表示字符數據,需要一種將每一個字符映射為對應數字的轉換方案。
目前普遍使用的方案中,ASCII是最簡單的。它涵蓋了您可能最習慣使用的普通拉丁字符。 對於這些字符,ord(c)返回字符c的ASCII編碼值:
ASCII就其本身而言還不錯。但是世界上正在使用著許多不同的語言,數字媒體中出現了數不清的符號和字形。可能需要在計算機代碼中表示的完整字符集遠遠超過您通常看到的普通拉丁字母,數字和符號。
Unicode是一個雄心勃勃的標準,它試圖在每個可能的平臺上,對各種可能的語言,為每個可能的字符提供數字編碼。 Python 3廣泛支持Unicode,包括允許字符串中使用Unicode字符。
了解更多信息:請參考Python文檔中Python的Unicode支持。
當您處於常用字符域時,ASCII和Unicode之間幾乎沒有實際區別。 但是ord()函數也可以返回Unicode字符的編碼值:
chr(c)對於給定整數返回一個字符值
chr()與ord()相反。給定數值n,chr(n)返回與n相對應的字符的字符串。
chr()同樣也可以處理Unicode字符:
len(s)返回一個字符串的長度
len()返回s中字符的數目:
str(obj)返回一個對象的字符串表示
事實上,Python中的任何對象都可以呈現為字符串。 str(obj)返回對象obj的字符串表示形式:
通常在程式語言中,可以使用數字索引或鍵值直接訪問有序數據集中的各個項目。 此過程稱為索引。
在Python中,字符串是字符數據的有序序列,因此可以以這種方式進行索引。 通過指定字符串名後方括號([])中的數字來訪問字符串中的單個字符。
Python中的字符串索引從零開始:字符串中的第一個字符具有索引0,下一個字符具有索引1,依此類推。 最後一個字符的索引將是字符串的長度減去1。
例如,字符串"foobar"的索引示意圖如下所示:
字符串索引
可以通過索引訪問各個字符,如下所示:
嘗試超出字符串末尾的索引會導致錯誤:
字符串索引也可以用負數指定,在這種情況下,索引在字符串中由後向前開始:-1指向最後一個字符,-2指向倒數第二個字符,依此類推。以下是顯示字符串中正負索引的相同圖表"foobar":
正數和負數索引
下面是一些負數索引的例子:
嘗試使用超出字符串開頭的負數進行索引會導致錯誤:
對於任意非空字符串s,s[len(s)-1]以及s[-1]都返回的最後一個字符。對於空字符串,任何索引都是沒有意義的。
字符串切片Python中還允許一種能夠從字符串中提取子字符串索引語法形式,該操作稱為字符串切片。如果s是一個字符串,則形如s[m:n]的表達式返回s中以m位置開頭,以n位置結束(不包含該位置)的部分:
請記住:字符串索引從零開始。字符串中的第一個字符的索引是0。在標準的索引以及切片中這都是適用的。
此外,第二個索引指定的是結果中未被包含的第一個字符 ——上例中的字符『r"(s[5])。這可能看起來有點不直觀,但它產生這樣的結果是有意義的:表達式s[m:n]將返回一個長度為n - m字符的子字符串,在本例中為5 - 2 = 3。
如果您省略第一個索引,則切片從字符串的頭部開始。因此,s[:m]和s[0:m]是等效的:
類似的,如果省略第二個索引如s[n:],則切片從第一個索引延續到字符串的末尾。這是對繁瑣的s[n:len(s)]的一種更好的,更簡潔的替代方案:
對於任何字符串s和任何整數n(0 ≤ n ≤ len(s)),s[:n] + s[n:]將等於s:
省略兩個索引將完整地返回原始字符串。然而它不是原始字符串的副本,它是對原始字符串的引用:
如果切片中的第一個索引大於或等於第二個索引,則Python返回一個空字符串。如果你正在尋找一種另類的生成空字符串的方式,那麼這是一種方法:
負數索引也可以與切片一起使用。-1表示最後一個字符,-2倒數第二個,依此類推,就像基本的索引一樣。下圖顯示了如何使用正數索引和負數索引從字符串"foobar"中切割子字符串"oob":
正負索引在字符串切片中的使用
下面是對應的Python代碼:
還有一種切片語法的變形可以進行介紹。再添加一個參數:第三個參數指明步幅(也叫做步長),表明在切片中檢索字符時每次跳過多少個字符。
例如,對於字符串"foobar",切片0:6:2以第一個字符開頭,以最後一個字符(整個字符串)結束,並且每次跳過第二個字符。如下圖所示:
帶有步幅的字符串索引
類似的,1:6:2指定以第二個字符(索引1)開頭並以最後一個字符結束的切片,並且步幅值再次為2導致每次都有一個字符被跳過:
另一個帶有步幅的字符串索引
說明的REPL代碼如下:
對於任何切片,可以省略第一個和第二個索引,並分別默認為第一個和最後一個字符:
您也可以指定負數步幅值,在這種情況下,Python會從後向前逐步處理字符串。在這種情況下,起始/第一個索引應該大於結束/第二個索引:
在上面的示例中,5:0:-2表示「從最後一個字符開始,每次後退2步,直到(但不包括)第一個字符」。
當您後退時,如果省略第一個和第二個索引,則以直觀的方式反轉默認值:第一個索引默認為字符串的結尾,第二個索引默認為開頭。下面是一個例子:
下面是反轉字符串的常見範例:
向字符串中插入變量在Python 3.6中,引入了一種新的字符串格式化機制。此功能正式命名為Formatted String Literal,但更常見的是其暱稱f-string。
f-strings提供的格式化功能非常廣泛,這裡不會詳細介紹。如果您想了解更多信息,可以查看Real Python的文章Python 3’s f-Strings: An Improved String Formatting Syntax (Guide)。本系列後面還有一個關于格式化輸出的教程,該教程對f-string進行了深入研究。
您可以立即開始使用一個簡單的f-string串的功能是變量插入。您可以直接在f-string文字中指定變量名稱,Python將使用相應的值替換名稱。
例如,假設您要顯示算術計算的結果。您可以使用簡單的print()語句執行此操作,使用逗號分隔數值和字符串文字:
但這很麻煩。使用f-string可以完成同樣的事情:
使用f-string重新實現,上面的示例看起來更清晰:
Python的三種引用機制中的任何一種都可用於定義f-string:
簡而言之,你做不到。字符串是Python認為不可變的數據類型之一,意味著無法更改。實際上,到目前為止您看到的所有數據類型都是不可變的。(Python確實提供了可變的數據類型,您很快就會看到。)
像這樣的語句會導致錯誤:
事實上,確實沒有太多修改字符串的必要。通過在特定位置生成具有所需更改的原始字符串的副本,您通常可以輕鬆地完成所需的操作。在Python中有很多方法可以做到這一點。如下一種可能的方法:
還有一個內置的字符串方法來完成此任務:
有關內置字符串方法的更多信息,請繼續閱讀!
字符串內置方法您在Python中的變量教程中了解到Python是一種高度面向對象的語言。Python程序中的每個數據項都是一個對象。
此外您也熟悉了函數:可調用以執行特定任務的可調用過程。
方法類似於函數。方法是與對象緊密關聯的特殊類型的可調用過程。與函數一樣,方法可以被調用從而執行不同的任務,但是它是在特定對象上調用的並且在執行期間需要了解其目標對象。
在對象上調用方法的語法如下:
這將調用對象obj上的方法.foo()。<args>指定傳遞給方法的參數(如果有)。
稍後在面向對象編程的討論中,您將探索有關定義和調用方法的更多信息。目前,我們的目標是介紹Python支持的一些常用的用於對字符串對象進行操作的內置方法。
在以下方法定義中,方括號([])中指定的參數是可選的。
大小寫轉換本組方法對目標字符串執行大小寫轉換。
s.capitalize()目標字符串首字母大寫
s.capitalize()返回一個s的副本,第一個字符轉換為大寫,所有其他字符轉換為小寫:
非字母字符不變:
s.lower()將字母字符轉換為小寫
s.lower()返回s中所有字母字符轉換為小寫的副本:
s.swapcase()轉換字母字符大小寫
s.swapcase()返回一個s中大寫字母字符轉換為小寫,小寫字母轉化為大寫的副本:
s.title()將目標字符串轉化為單詞首字母大寫
s.title()返回s的一個副本,其中每個單詞的第一個字母轉換為大寫,其餘字母為小寫:
該方法使用相當簡單的算法。它並不試圖區分重要和不重要的單詞,而且它不能優雅地處理撇號,所有格或首字母縮略詞:
s.upper()將字母字符轉化為大寫
s.upper()返回s中所有字母字符轉換為大寫的副本:
查找和替換這些方法提供了在目標字符串中搜索指定子字符串的各種方式。
該組中的每個方法都支持可選的<start>和<end>參數。這些參數在字符串切片時被解釋:方法的操作僅限於目標字符串中從<start>位置字符開始到(不包括)<end>位置字符的部分。如果<start>被指定了但<end>沒有,則該方法應用於目標字符串中從<start>開始直到字符串的末尾的部分。
s.count(<sub>[, <start>[, <end>]])計算目標字符串中子字符串的出現次數
s.count(<sub>)返回字符串s中非重疊子串<sub>出現的次數:
計數被限制在由<start>和<end>所指定的子串內,如果參數被設定的話:
s.endswith(<suffix>[, <start>[, <end>]])判斷目標字符串是否以給定子字符串結尾
如果s以指定的<suffix>結尾,s.endswith(<suffix>)返回True,否則返回False:
判斷被限制在由<start>和<end>所指定的子串內,如果參數被設定的話:
s.find(<sub>[, <start>[, <end>]]在目標字符串中搜索給定的子字符串
s.find(<sub>)返回在s中找到子字符串<sub>的最小索引:
如果指定的子串沒有找到,該方法返回-1:
檢索被限制在由<start>和<end>所指定的子串內,如果參數被設定的話:
s.index(<sub>[, <start>[, <end>]])在目標字符串中搜索給定的子字符串
這個方法與.find()功能相同,只是在查找不到<sub>時會產生一個異常而非返回-1:
從末尾開始搜索目標字符串中的給定子字符串
s.rfind(<sub>)返回在s中找到子字符串<sub>的最大索引:
和.find()一樣,如果指定的子串沒有找到,該方法返回-1:
檢索被限制在由<start>和<end>所指定的子串內,如果參數被設定的話:
s.rindex(<sub>[, <start>[, <end>]])從末尾開始搜索目標字符串中的給定子字符串
這個方法與.rfind()功能相同,只是在查找不到<sub>時會產生一個異常而非返回-1:
判斷目標字符串是否以給定子字符串開頭
如果s以指定的<suffix>開頭,s.startswith(<suffix>)返回True,否則返回False:
判斷被限制在由<start>和<end>所指定的子串內,如果參數被設定的話:
字符分類此組方法根據字符串包含的字符對字符串進行分類。
s.isalnum()確定目標字符串是否由字母數字字符組成
如果s是非空的且其所有字符都是字母或數字,s.isalnum()返回True,否則返回False:
判斷目標字符串是否由字母字符組成
如果s是非空的並且其所有字符都是字母,s.isalpha()返回True,否則返回False:
s.isdigit()判斷目標字符串是否由數字字符組成
如果s是非空的並且其所有字符都是數字,s.digit()返回True,否則返回False:
s.isidentifier()判斷目標字符串是否是有效的Python標識符
如果s根據語言定義是有效的Python標識符,s.isidentifier()返回True,否則返回False:
注意:與Python關鍵字匹配的字符串.isidentifier()將返回True,即使它實際上不是有效的標識符:
您可以調用iskeyword()函數測試字符串是否與Python關鍵字匹配,該函數包含在名為keyword的模塊中。一種可能的方法如下所示:
如果你真的想確保一個字符串可以作為一個有效的Python標識符,你應該檢查.isidentifier()是否為True以及iskeyword()是否為False。
請參閱 Python Modules and Packages—An Introduction閱讀有關Python模塊的更多信息。
s.islower()判斷目標字符串的字母字符是否為小寫
如果s是非空的並且它包含的所有字母字符都是小寫的,s.islower()則返回True,否則返回False。忽略非字母字符:
判斷目標字符串是否完全由可列印字符組成
如果s為空或其包含的所有字母字符都是可列印的,s.isprintable()返回True。如果s包含至少一個不可列印的字符,則返回False。忽略非字母字符:
注意:如果s是空字符串,這是唯一個返回True的.isxxxx()方法。所有其它方法都對空字符串返回False。
英文原文:https://realpython.com/python-strings/