Python程序員 · 程式 ·

Python中的字符串和字符數據(下)

已保存

s.isspace()

判斷目標字符串是否由空白字符組成

如果s是非空的並且所有字符都是空白字符,s.isspace()返回True,否則返回False。

最常遇到的空白字符是空格" ",制表符" "和換行符" ":

但是,還有一些其他ASCII字符可以作為空格,而且如果你考慮使用Unicode字符,還會有更多:

( "" 以及 " " 是ASCII換頁和回車的轉義字符;" " 是Unicode Four-Per-Em Space的轉義字符。)

s.istitle()

判斷目標字符串是否為單詞首字母大寫

如果s非空且每個單詞的第一個字母字符為大寫,所有其他字母字符均為小寫,s.istitle()返回True,否則返回False:

注意:以下是Python文檔中對.istitle()的描述,如果您覺得這更直觀的話:「大寫字符只能跟在非大小寫字符的後面,小寫字符只能跟在大小寫字符的後面。」

s.isupper()

判斷目標字符串的字母字符是否為大寫

如果s是非空的,並且它包含的所有字母字符都是大寫的,則s.isupper()返回True,否則為False。非字母字符將被忽略:

字符串格式化

本組方法修改或增強字符串的格式。

s.center(<width>[, <fill>])

在欄位中居中字符串

s.center(<width>)返回一個s在<width>寬度欄位居中的字符串。默認情況下,由ASCII碼中的空格字符進行填充:

如果指定了可選參數<fill>,則將其用作填充字符:

如果s長度已經大於等於<width>,則返回結果不改變:

s.expandtabs(tabsize=8)

擴展字符串中的制表符

s.expandtabs()用空格替換每個制表符(『 ")。默認情況下,在假設制表符每八列一停的情況下填充空格:

tabsize是一個可選關鍵字參數,用來指定替換制表符的停止列數。

s.ljust(<width>[, <fill>])

左對齊欄位中的字符串

s.ljust(<width>)返回一個s在<width>寬度欄位左對齊的字符串。默認情況下,由ASCII碼中的空格字符進行填充:

如果指定了可選參數<fill>則將其用作填充字符:

如果s長度已經大於等於<width>,則返回結果不改變:

s.lstrip([<chars>])

修剪字符串中的前導字符

s.lstrip()返回刪除左端全部空白字符的s的副本:

如果指定了可選參數<chars>,則它指定了一個被移除的字符的集合:

s.replace(<old>, <new>[, <count>])

替換字符串中出現的子字符串

s.replace(<old>,<new>)返回將s中所有的子串<old>替換為<new>的副本:

如果指定了可選參數<count>,僅執行最大數目為<count>的替換,從字符串左側開始:

s.rjust(<width>[, <fill>])

右對齊欄位中的字符串

s.rjust(<width>)返回一個s在<width>寬度欄位右對齊的字符串。默認情況下,由ASCII碼中的空格字符進行填充:

如果指定了可選參數<fill>,則將其用作填充字符:

如果s長度已經大於等於<width>,則返回結果不進行改變:

s.rstrip([<chars>])

修剪字符串中的尾隨字符

s.rstrip()返回刪除右端全部空白字符的s的副本:

如果指定了可選參數<chars>,則它指定了一個被移除的字符的集合:

s.strip([<chars>])

從字符串的左端和右端修剪字符

s.strip()基本上相當於連續調用s.lstrip()和s.rstrip()。如果沒有指定<chars>參數,它會刪除前導和尾隨空白字符:

與.lstrip()和.rstrip()一樣,可選參數<chars>指定要刪除的字符集:

注意:當字符串方法的返回值是另一個字符串時(通常是這種情況),可以通過連結調用來連續調用方法:

s.zfill(<width>)

用零填充字符串左側

s.zfill(<width>)返回一個左側用指定<width>個"0"字符填充的s的副本

如果s包含前導符號,則在插入零後它將保留在結果字符串的左邊緣:

如果s長度已經大於等於<width>,則返回結果不進行改變:

.zfill()在用字符串表示數字的過程中最有用,但Python還是會很樂意向普通字符串中添加零:

在字符串和列表之間轉換

此組中的方法通過將對象粘貼在一起以生成字符串或將字符串分成多個片段來在字符串和某些複合數據類型之間進行轉換。

這些方法操作或返回iterables,這是對象的順序集合的通用Python術語。您將在即將到來的definite iteration教程中更詳細地探索iterables的內部工作原理。

這些方法中很多都返回列表或者是元組。這是兩個類似的複合數據類型,它們是Python中可疊代對象的典型示例。

它們將在下一個教程中介紹,所以很快您將了解它們。在此之前,只需要將它們視為值的序列。一個列表用方括號括起來([]),一個元組用括號括起來(())。

介紹完畢,讓我們來看看最後一組字符串方法。

s.join(<iterable>)

從可疊代對象中連結字符串

s.join(<iterable>) 返回由分隔符s連接在<iterable>中的對象所組成的字符串。

需要注意.join在分隔符字符串s上進行調用。<iterable>也必須是一個字符串對象序列。

一些示例代碼應該會讓說明變得更清晰。在下面的例子中,分隔符s是字符串",",並且<iterable>是字符串值的列表。

返回結果是列表中的對象被逗號分隔所組成的單一字符串。

在下一個例子中,<iterable>被指定為單一字符串值。當一個字符串值作為可疊代對象時,它被解釋成字符串中每個獨立字符所組成的列表。

因此,":".join("corge") 返回的結果是"corge"中的每個字符通過":"分割所組成的字符串。

下面這個例子報錯了因為<iterable>中有一個對象不是字符串:

但是,這個錯誤可以改正:

很快你就會看到,Python中的許多複合對象可以被解釋為可疊代對象,.join()對於從它們中創建字符串特別有用。

s.partition(<sep>)

基於分隔符分割字符串

s.partition(<sep>)在第一次出現字符串<seq>的地方對s進行分割。返回的三元元組包括:

  • s中<seq>之前的部分
  • <seq>本身
  • s中<seq>後面的部分

下面是一些實際使用.partition的例子:

如果在s中沒有找到<seq>,則返回的元組包含s和兩個空字符串:

記住:列表和元組將會在下一個教程介紹。

s.rpartition(<sep>)

基於分隔符分割字符串

s.rpartition(<sep>)與s.partition(<sep>)在功能上極其相似,除了是在s中最後一次出現<seq>而不是第一次出現的地方進行分割:

s.rsplit(sep=None, maxsplit=-1)

將一個字符串分成一組子串

在不帶參數的情況下,s.rsplit()將s中任何空白字符序列分隔的子字符串進行分割,並將子字符串用列表返回:

如果<sep>被指定,則將其用作分割標識:

(如果<seq>的值被指定為None,則字符串依照空白字符進行分割,就和<seq>沒有被指定一樣)

當<sep>明確作為分隔符給出時,s中連續的分隔符被認為對空字符串進行分隔,返回結果如下:

然而,當省略<sep>時情況則並非如此。在這種情況下,連續的空白字符被合併成一個分隔符,並且結果列表中將不會包含空字符串:

如果指定了可選參數<maxsplit>,僅從字符串右側開始執行最大次數的分割操作:

<maxsplit>的默認值為-1,代表者所有可能的分割都要執行——與<maxsplit>被完全忽略的時候一樣:

s.split(sep=None, maxsplit=-1)

將一個字符串分成一組子串

s.split()與s.rsplit()看起來非常像,除了當<maxsplit>被指定的時候,從s左側開始計數而不是右側:

如果<maxsplit>沒有指定,.split()和.rsplit()是完全一樣的。

s.splitlines([<keepends>])

按照行邊界分割字符串

s.splitlines()將s按行分割並將結果用列表返回。下面的字符或者字符序列都被看作構成了行邊界:

轉義字符 描述

換行

回車

回車+換行或行列表或換頁

文件分隔符

組分隔符

記錄分隔符

…下一行(C1控制代碼)Unicode行分隔符Unicode段落分隔符

下面是一個使用了多個不同行分割符的例子:

如果連續的行界符出現在字符串中,它們會被認為是對空行進行分隔,會在結果列表中進行返回:

如果指定了可選參數<keepends>並且值為真,那麼行界符將會包含在結果字符串中:

bytes對象

bytes對象是用於二進位數據操作的核心內置類型之一。一個bytes對象是單個字節值組成的不可更改的序列。bytes對象中的每個元素都是在0到255之間的一個小整數。

定義bytes對象字面量

bytes對象與字符串對象的字面量按照相同的方法定義,需要額外添加"b"前綴:

與字符串一樣,你可以使用單引號,雙引號以及三引號:

bytes字面量只允許ASCII編碼字符。任何超過127的字符值必須使用適當的轉義字符進行指定:

與字符串相同,在bytes字面量中使用"r"前綴用來禁用轉義字符:

使用內置bytes()函數定義一個bytes對象

bytes()函數可以創建一個bytes對象。返回哪種bytes對象取決於傳遞給函數的參數。可能的形式如下:

bytes(<s>, <encoding>)

從字符串中創建bytes對象

bytes(<s>, <encoding>)根據指定的<encoding>利用str.encode()將字符串<s>轉化為一個bytes對象:

技術說明:在bytes()函數的這種形式中,<encoding>參數是必需的。「編碼」是指將字符轉換為整數值的方式。值"utf8"表明使用Unicode轉換格式UTF-8,它是一種可以處理每個可能的Unicode字符的編碼。UTF-8也可以通過指定<encoding>為"UTF8","utf-8"或"UTF-8"。

更多信息,請參考Unicode文檔。只要你處理的是普通的拉丁字符,UTF-8都會很合適。

bytes(<size>)

創建一個由null(0x00)組成的bytes對象

bytes(<size>)定義了一個指定<size>的bytes對象,其中<size>必須為正整數。結果字節對象使用null(0x00)字節進行初始化:

bytes(<iterable>)

從可疊代對象中創建bytes對象

bytes(<iterable>) 從<iterable>產生的一系列整數中定義一個bytes對象。<iterable>必須是一個能夠產生一系列0到255範圍內的整數的可疊代對象:

bytes對象上的操作

類似字符串,bytes對象支持常見的序列操作:

  • in和not in運算符:

  • 連接(+)以及複製(*)運算符:

  • 索引和切片

  • 內置函數:

許多定義在字符串上的方法在字節對象中也是合法的:

然而,需要注意的是,當在bytes對象上調用這些運算符以及方法的時候,操作數和參數也必須是bytes對象:

雖然bytes對象定義和表示基於ASCII文本,但它實際上表現一個包含範圍0到255的小整數的不可變序列。這就是為什麼來自bytes對象的單個元素顯示為整數:

切片顯示為字節對象,儘管只有一個字節長:

您可以使用內置的list()函數將字節對象轉化為一個整數列表:

十六進位數通常用於指定二進位數據,因為兩個十六進位數字直接對應於單個字節。bytes類支持兩個附加的方法便於與十六進位進行相互轉化。

bytes.fromhex(<s>)

返回由十六進位值字符串構造的bytes對象

bytes.fromhex(<s>)返回在<s>中的每一對十六進位數字對應的字節值所組構建的字節對象。<s>中的十六進位數值對可以隨意被空白字符分開,空白字符會被忽略:

注意:這個方法是一個類方法,不是對象方法。它與bytes類綁定,而不是bytes對象。在即將到來的面向對象編程教程中,您將深入研究類,對象及其各自方法之間的分別。現在,只需觀察到此方法是在bytes類上調用的,而不是在對象上b調用的。

b.hex()

從bytes對象中返回十六進位值的字符串

b.hex()返回將bytes對象b轉換為十六進位數字對的字符串的結果。也就是說,它與.fromhex()的功能是相反的:

注意:與.fromhex()相對的,.hex()是一個對象方法而非類方法。因此,它在bytes類型的對象上調用,而不是類本身。

bytearray對象

Python支持的另一種二進位序列類型叫做bytearray。bytearray對象與bytes對象非常相似,僅有一些不同:

  • Python中沒有專門的語法來定義bytearray字面量,類似"b"前綴可以用來定義bytes對象。bytearray對象始終使用bytearray()內置函數創建:

  • bytearray對象是可變的。您可以使用索引和切片修改bytearray對象的內容:

bytearray對象也可以直接從bytes對象中創建:

結論

本教程深入介紹了Python為字符串處理提供的許多不同機制,包括字符串運算符,內置函數,索引,切片和內置方法。同樣也向您介紹了bytes和bytearray類型。

英文原文:https://realpython.com/python-strings/

譯者:搞一個大新聞

聲明:文章觀點僅代表作者本人,PTTZH僅提供信息發布平台存儲空間服務。
喔!快樂的時光竟然這麼快就過⋯