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

2021-02-20 Python程式設計師


目錄

字符串操作

字符串運算符

字符串內置函數

字符串索引

字符串切片

在字符串切片過程中指定步幅

向字符串中插入變量

修改字符串

字符串內置方法

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()返回一個對象的字符串表示形式

下面將會對上述方法進行更詳細的介紹。

ord(c)

對於給定字符返回一個整數值    

從最基礎的層面來說,計算機將所有的信息用數字形式存儲。為了表示字符數據,需要一種將每一個字符映射為對應數字的轉換方案。

目前普遍使用的方案中,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>[, <start>[, <end>]])

從末尾開始搜索目標字符串中的給定子字符串

s.rfind(<sub>)返回在s中找到子字符串<sub>的最大索引:

和.find()一樣,如果指定的子串沒有找到,該方法返回-1:

檢索被限制在由<start>和<end>所指定的子串內,如果參數被設定的話:

s.rindex(<sub>[, <start>[, <end>]])

從末尾開始搜索目標字符串中的給定子字符串

這個方法與.rfind()功能相同,只是在查找不到<sub>時會產生一個異常而非返回-1:

s.startswith(<prefix>[, <start>[, <end>]])

判斷目標字符串是否以給定子字符串開頭

如果s以指定的<suffix>開頭,s.startswith(<suffix>)返回True,否則返回False:

判斷被限制在由<start>和<end>所指定的子串內,如果參數被設定的話:

字符分類

此組方法根據字符串包含的字符對字符串進行分類。

s.isalnum()

確定目標字符串是否由字母數字字符組成

如果s是非空的且其所有字符都是字母或數字,s.isalnum()返回True,否則返回False:

s.isalpha()

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

如果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.isprintable()

判斷目標字符串是否完全由可列印字符組成

如果s為空或其包含的所有字母字符都是可列印的,s.isprintable()返回True。如果s包含至少一個不可列印的字符,則返回False。忽略非字母字符:

注意:如果s是空字符串,這是唯一個返回True的.isxxxx()方法。所有其它方法都對空字符串返回False。

英文原文:https://realpython.com/python-strings/
譯者:搞一個大新聞

相關焦點

  • python數據類型總結——數字和字符串
    如同人有姓名一般,當python中的數據被創建後,會在存儲介質中分配一塊區域用於存儲數據。通常,我們需要一個名字來指代這部分數據。python變量數據的名字,稱之為變量。即一個變量在創建初或者使用的過程中,不會固定成某個類型。你可以給它一個數字,也可以給它一個字符串。這點和javascript一樣,但是,和Java不同。
  • 13-python中的字符串
    通過前兩天的文章12-python中的集合我們學習了有關集合的知識,今天我們將學習一下python中的字符串。(一)字符串的介紹    字符串,是python中的基本數據類型,是一個不可變的字符序列。    字符串的駐留機制,是僅保留一份相同且不可變字符串的一種方法。
  • Python兩種基本數據類型:數值及字符串;python交互式運行環境
    裡面用到很多python編程的知識點。筆者覺得有必要解釋一下。編程需要大量數據,為了編程方便,數據就分成了不同的類型,不同的數據類型有不同的特性。Python兩種基本數據類型python語言中,有兩種最基本的數據類型:數值類型及字符串類型。
  • Python的基本數據類型之二:字符串(String)(上)
    字符串類型在Python中是一種最常見,也是最常用的類型,從今天開始,我們分三個章節,儘可能詳細的對字符串進行介紹,希望朋友們多多關注我們,對我們也是一種極大的支持和鼓勵,謝謝!字符串聲明:在Python3中,字符串的聲明方法有:單引號、雙引號、三個單引號、三個雙引號;例如:>>>str1= 'hello world'>>>str2= "hello world
  • Python數據類型之字符串
    # 字符串是python中最常用的數據類型,我們可以使用引號來創建字符串,引號可以是單引號,雙引號或三引號,本質上單引號和雙引號以及三引號的作用是一樣的 # 字符串是一種不可變的序列類型,單個字符從左到右按照順序排列,同時修改某個位置的字符是不被允許的 #
  • Python中的字符串處理方法
    a = "abc"b = 1print(a + b)Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/python基礎/test.py
  • Python數據類型串講(上)
    在計算機科學中,數據是指所有能輸入到計算機並被電腦程式處理的符號的介質的總稱,是用於輸入電子計算機進行處理,具有一定意義的數字字母、符號和模擬量等的統稱。2、數據類型的作用python的標準數據類型共有六種,為什麼要將數據分為不同的類型呢?
  • Python變量,輸入和輸出,數字,字符串操作
    一、變量以及類型在Python中,存儲數據,就需要使用到一個叫做變量的東西。標示符是自己定義的,直指程式設計師的本心,就是開發人員在程序中自定義的一些符號和名稱,如變量名 、函數名等。python中推薦使用下劃線「_」來連接,但在命名時一定要注意關鍵字。
  • 【Python字符串操作】字符串分割函數
    對於長字符串,我們一般要怎麼處理呢?除了切片,但是切片太麻煩了。python為我們提供了字符串切割函數,它不僅可以通過指定字符切割,也可以去除空格符哦。1.split()語法:str.split(str=' ', num=string.count(str))描述:通過指定分隔符對字符串進行切片,如果參數num有指定值,則僅分隔num個子字符串
  • python基本元素:數字、字符串和變量,那些經常忽略的知識點!
    字符串型:字符組成的序列。變量、名字和對象python裡所有數據,布爾型、整數、浮點型、字符串型,甚至大型數據結構、函數以及程序,都是以對象的形式存在。對象就像一個塑料盒子,裡面裝的是數據。對象有不同類型,例如布爾型、整數、浮點型、字符串型,類型決定了可以對它進行的操作。
  • Python3的字符串類型(瘋狂Python)
    字符串可以用+運算符連接在一起,用*運算符重複。Python中的字符串有兩種索引方式,從左往右以0開始,從右往左以-1開始。Python中的字符串不能改變。4.2.1 repr和字符串Python不允許直接拼接數值和字符串,必須先將數值轉換成字符串。
  • Python字符串拼接(包含字符串拼接數字)
    str2"strname 表示拼接以後的字符串變量名,str1 和 str2 是要拼接的字符串內容。/c.biancheng.net/python/JavaPythonC++PHP需要注意的是,這種寫法只能拼接字符串常量。
  • Python中的「f-」字符串
    前言在Python中,字符串的列印大家都知道是用print函數,如果在字符串中嵌有其它變量的話,一般我們有兩種方式來處理,一是最原始的將字符串、變量分別作為
  • Python基礎:數據類型和變量&字符串和編碼
    但是,計算機能處理的遠不止數值,還可以處理文本、圖形、音頻、視頻、網頁等各種各樣的數據,不同的數據,需要定義不同的數據類型。在Python中,能夠直接處理的數據類型有以下幾種:整數Python可以處理任意大小的整數,當然包括負整數,在程序中的表示方法和數學上的寫法一模一樣,例如:1,100,-8080,0,等等。
  • Python Lesson 1 輸出|轉義字符|原字符
    1.python自述對大數據分析、人工智慧、深度學習等 有龐大的代碼庫2.python簡介跨平臺的電腦程式設計語言,解釋型語言,交互式語言
  • Python字符串處理的8招秘籍
    Python的字符串處理,在爬蟲的數據解析、大數據的文本清洗,以及普通文件處理等方面應用非常廣泛,而且Python對字符串的處理內置了很多高效的函數,功能非常強大、使用非常方便。今天我就把字符串處理時用到最多的方法總結分享給大家,希望大家可以輕鬆應對字符串處理。
  • 慢步學習二級python,字符串類型的操作:操作符,函數和方法
    繼續學習二級python考試的大綱內容:4.字符串類型的操作:字符串操作符,處理函數和處理方法字符串和數值是python語言的基礎數據類型。學習字符串類型數據的操作是學習python的基礎。字符串操作符字符串常見操作符有2個+ *在應用中的意義是 連接 和 重複如上圖,第一個指令,「愛」+「你」,得到字符串「愛你」。
  • python爬蟲 - 字符串
    python字符串Python中的字符串可以使用單引號、雙引號和三引號(三個單引號或三個雙引號,可以換行的)括起來,使用反斜槓 \ 轉義特殊字符Python3源碼文件默認以UTF-8編碼,所有字符串都是unicode字符串支持字符串拼接、截取等多種運算
  • python爬蟲-字符串
    python字符串 Python中的字符串可以使用單引號、雙引號和三引號(三個單引號或三個雙引號,可以換行的)括起來,使用反斜槓 \ 轉義特殊字符 Python3源碼文件默認以UTF-8編碼,所有字符串都是unicode字符串 支持字符串拼接、截取等多種運算 我們還是舉個例子來說
  • Python字符串
    字符串序列用於表示和存儲文本,python中字符串是不可變對象。