天天看點

Python字元串類型介紹

作者:但求無Bug

一、簡介

字元串為Python中常用類型,與Java不同的是,Python既可使用單引号表示,也可使用雙引号表示。如下面的例子:

a = "hello world"
b = 'i am ok'           

上述聲明的a和b均為Python中合規的字元串表示形式。當然,若在Java中,單引号表示字元類型,雙引号才表示字元串。

若此時使用type()函數來檢視字元串的類型,會輸出<class 'str'>。

二、下标

所謂下标其實就是索引。在Python中,可通過下标來擷取指定位置的字元,如下面的例子:

name = "hello world"
print(name[0])
print(name[1])
print(name[2])           

執行結果如下:

Python字元串類型介紹

這與Java有所不同。在Java中,若想擷取指定位置的字元,隻能通過字元串的charAt(int index)方法來擷取,而非直接指定對應的位置。

三、擷取子串

若需在Java中擷取子串,則可通過字元串對象的subString方法來擷取。而在Python中,擷取子串則是通過所謂的切片操作來完成。所謂切片就是從待操作對象截取部分内層。除字元串外,清單、元組、集合等也都支援該操作。

其文法格式為:

序列[起始坐标:結束坐标:步長]           

需要說明的是,使用切片功能時,并不會包含結束位置處的資料。若不指定結束坐标,則預設為序列的長度。若不指定步長,則預設為1。

下面為對應的例子:

s = "hello world"
# 隻指定起始位置
print(s[6:])
# 指定結束位置
print(s[:5])
# 指定起始位置和結束位置
print(s[6: len(s)])

s2 = "a b c d e f g"
# 隻指定步長
print(s2[::2])
# 指定起始位置、結束位置和步長
print(s2[6: len(s2): 2])           

執行結果如下:

Python字元串類型介紹

此外,Python切片的起始位置和結束位置還支援負數。如下面的例子:

s = "hello world"
# 隻指定起始位置
print(s[-5:])
# 指定起始位置和結束位置
print(s[-len(s): -6])           

執行結果如下:

Python字元串類型介紹

這與Java有所差別,因為在Java中,使用subString方法時,起始索引和結束索引均不支援負數。

四、常用方法

對于字元串常用的方法而言,大緻可分為三類,分别是:查找、修改和判斷。

4.1 查找

所謂查找就是查找某個子串在字元串中出現的位置或次數。下面簡單介紹一下常用的查找方法。

  • find和rfind

find方法用于檢測某個字元是否存在于該字元串中,若存在,則傳回該子串開始處的下标;若不存在,則傳回-1。而rfind與find作用類似,差別在于,rfind是從字元串的末尾開始向前進行查找。

下面為對應的文法格式:

# find
字元串序列.find(子串, 開始位置下标, 結束位置下标)
# rfind
字元串序列.rfind(子串,開始處下标,結束位置下标)           

需要說明的是,開始位置下标和結束位置下标均可進行省略,當開始位置下标省略時預設為0,當結束位置下标省略時預設為字元串的長度。

下面給出對應的示例:

s = "Tom and Jerry and Spike and Tuffy"
print("首個and出現的位置:", s.find("and"))
print("從下标7開始,and首次出現的位置:", s.find("and", 7))
print("首個ands出現的位置:", s.find("ands"))

print("從末尾開始,首個and出現的位置:", s.rfind("and"))
print("從下标0開始,到倒數第12個字元結束,倒數首個and出現的位置:", s.rfind("and", 0, -12))           

執行結果如下:

Python字元串類型介紹
  • index和rindex

index方法用于檢查某個子串是否被包含在該字元串中,若包含則傳回子串開始位置下标,否則抛異常。rindex與index類似,隻不過是從末尾開始查找而已。

這兩個方法與Java中的indexOf和lastIndexOf方法有相似的作用。當然,indexOf和lastIndexOf無法指定結束位置下标,且起始位置下标不能指定為負數。

下面是對應的文法格式:

# index
字元串序列.index(子串,開始位置下标,結束位置下标)
#rindex
字元串序列.rindex(子串,開始位置下标,結束位置下标)           

需要說明的是,開始位置下标和結束位置下标可進行省略,當開始位置下标省略時預設為0,當結束位置下标省略時預設為字元串的長度。

下面給出對應的例子:

s = "Tom and Jerry and Spike and Tuffy"
firstIndex = s.index("and")
print("是否包含and字元串:", firstIndex > -1, ", 對應的坐标為:", firstIndex)
index = s.index("and", 7)
print("是否包含and字元串:", index > -1, ", 對應的坐标為:", index)

lastIndex = s.rindex("and")
print("是否包含and字元串:", lastIndex > -1, ", 對應的坐标為:", lastIndex)
rightIndex= s.rindex("and", 7, -10)
print("是否包含and字元串:", rightIndex > -1, ", 對應的坐标為:", rightIndex)

notIndex = s.index("ands")
print("是否包含and字元串:", notIndex > -1, ", 對應的坐标為:", notIndex)           

執行結果如下:

Python字元串類型介紹
  • count

count用于查詢某個子串在字元串中出現的次數,其格式為:

字元串序列.count(⼦串, 開始位置下标, 結束位置下标)           

需要說明的是,開始位置下标和結束位置下标均可進行省略,當開始位置下标省略時預設為0,當結束位置下标省略時預設為字元串的長度。

下面給出對應的例子:

s = "Tom and Jerry and Spike and Tuffy"
print("and出現的次數為:", s.count("and"))
print("下标從7到最後,and出現的次數為:", s.count("and", 7))
print("ands出現的次數為 :", s.count("ands"))           

執行結果如下:

Python字元串類型介紹

4.2 修改

所謂修改就是通過函數對字元串中的資料進行修改。下面介紹一下常見的修改函數。

  • replace

replace的作用是将字元串中指定的子串替換為目标子串,其文法格式為:

字元串序列.replace(舊子串,新子串,替換次數)           

對于替換次數而言,若未指定,則預設為該子串出現的次數;若指定次數小于出現次數,則替換指定次數;若指定次數大于出現次數,則替換實際出現的次數。

該方法與Java中的字元串的replace有相同的作用。當然,Java中的replace方法無法指定替換次數。

此外,替換操作并不會對原字元串有任何影響,其隻會傳回替換後的新字元串。

下面給出對應的示例:

s = "Tom and Jerry and Spike and Tuffy"
# 将舊子串替換為新子串
print("将s中的and替換為or後為:", s.replace("and", "or"))
# 指定替換次數,小于該子串出現的次數
print("将s中的and替換為or, 替換次數為2,替換後為:", s.replace("and", "or", 2))
# 指定替換次數,大于該子串出現的次數
print("将s中的and替換為or, 替換次數為4,替換後為:", s.replace("and", "or", 4))
print("進行替換操作後,原字元串為:", s)           

執行後結果如下:

Python字元串類型介紹
  • split 和 join

split作用是根據指定的字元來分隔字元串,而Join的作用則是根據指定的字元串來将由多個字元串組成的字元序列進行合并。其文法格式為:

# spilt
字元串序列.split(分割字元, num)
# join
 連接配接字元串.join(多個字元串組成的序列)           

對于split的num而言,表示分隔字元出現的次數。當然,若未指定該次數,則預設為分隔符出現的次數;若指定的次數小于分隔符出現的次數,則會分割指定次數;若指定的次數大于分隔符出現的次數,則分割時按分隔符實際出現的次數進行分割。

spilt和join方法在Java中也有類似實作,當然,Java中的split方法無法指定分割次數。

下面為對應的例子:

s = "Tom and Jerry and Spike and Tuffy"
# 根據and進行分割
print("根據and進行分割後結果為:",s.split("and"))
# 根據and進行分割,隻分割2次
print("根據and進行分割,分割次數為2,分割後結果為:",s.split("and", 2))
# 根據and進行分割,隻分割4次
print("根據and進行分割,分割次數為2,分割後結果為:",s.split("and", 4))
# 根據 " "進行分割
print("根據空格進行分割後結果為:", s.split(" "))

listStr = ["Tom", "Jerry", "Spike", "Tuffy"]
# 用下劃線進行連接配接
print("用下劃線進行連接配接後為:", "_".join(listStr))
# 用...進行連接配接
print("用...進行連接配接後為:", "...".join(listStr))           

執行結果如下:

Python字元串類型介紹
  • capitalize 和 title

capialize和title都可将字元串的首字母變為大寫。差別在于,capitalize的作用是将整個字元串的首字母改為大寫,而title則是将字元串的各單詞的首字母變為大寫,其文法格式為:

# capitalize
字元串.capitalize()
# title
字元串.title()           

需要說明的是,當字元串被capitalize方法轉換後,除首字母保持大寫外,其餘字元均會變為小寫。而title則是除各單詞的首字母外,其餘字母都會被改為小寫。這兩個方法暫未在Java中找到原生實作。

下面給出對應的示例:

s = "Tom and Jerry and Spike and Tuffy"
print("執行capitalize方法後結果為:", s.capitalize())

print("每個單詞的首字母轉換為大寫後結果為:", s.title())
s2 = "PutAndPoll"
print("轉換後結果為:", s2.title())           

執行結果如下:

Python字元串類型介紹
  • lower 和 upper

lower和uppder用于改變字元串的大小寫。其中,lower是将字元串全部轉為小寫,而upper則是将字元串全部轉為大寫。當然,若為數字或其他非字母的數字,則會被忽略。其文法格式為:

# lower
字元串.lower()
# upper
字元串.upper()           

這兩個方法在Java也有類似實作,lower類似于toLowerCase方法,而upper則類似于toUpperCase方法。

下面為對應的示例代碼:

s = "Tom and Jerry and Spike and Tuffy"
print("全部轉換為小寫後:", s.lower())
print("全部轉換為大寫後:", s.upper())           

執行結果如下:

Python字元串類型介紹
  • lstrip、rstrip和strip

這三個函數都可删除字元串的空白字元,差別在于,lstrip是删除字元串左側的空白字元,rstrip是删除字元串右側的空白字元,而strip是将字元串兩側的空白字元都進行删除。其文法格式為:

# lstrip
字元串.lstrip()
# rstrip
字元串.rstrip()
# strip
字元串.strip()           

對于這三個方法來說,Java隻實作了類似strip方法,也就是trim方法。

下面是對應的示例代碼:

s = "   Tom and Jerry and Spike and Tuffy    "
print("删除左側的空白字元後為:", s.lstrip(), ", 長度為:", len(s.lstrip()))
print("删除右側的空白字元後為:", s.rstrip(), ", 長度為:", len(s.rstrip()))
print("删除兩側的空白字元後為:", s.strip(), ", 長度為:", len(s.strip()))           

執行結果如下:

Python字元串類型介紹
  • ljust、rjust和center

這三個方法實作對效果類似于對齊,ljust是左對齊,rjust是右對齊,而center則是中心對齊。當然,若原字元串的長度小于指定長度時,會使用指定的字元串進行填充;若原字元串長度大于指定長度,則自己傳回原字元串。其文法格式為:

# ljust
字元串.ljust(長度,填充字元)
# rjust
字元串.rjust(長度,填充字元)
# center
字元串.center(長度,填充字元)           

需要說明的是,填充字元串隻能是單個字元,若為多個字元,則會抛出異常。

下面給出對應的示例代碼:

s = "hello"
# 預設為空格機械能填充
print("左對齊并填充到10位:", s.ljust(10))
# 使用指定字元進行填充
print("左對齊并填充到10位:", s.ljust(10, "."))

# 預設為空格機械能填充
print("右對齊并填充到10位:", s.rjust(10))
# 使用指定字元進行填充
print("右對齊并填充到10位:", s.rjust(10, "."))

# 預設為空格機械能填充
print("中心對齊并填充到10位:", s.center(10))
# 使用指定字元進行填充
print("中心對齊并填充到10位:", s.center(10, "."))           

執行結果如下:

Python字元串類型介紹

4.3 判斷

所謂判斷就是通過函數來确定該字元串是否符合特定條件,其傳回結果為布爾值。下面簡單介紹一下常見的判斷類函數。

  • startswith 和 endswith

startwith用于判斷該字元串是否以指定的子串開頭,而endswith則用于判斷該字元串是否以指定的子串結尾。其文法格式為:

# startswith
字元串序列.startswith(⼦串, 開始位置下标, 結束位置下标)
# endswith
字元串序列.endswith(⼦串, 開始位置下标, 結束位置下标)            

這兩個方法在Java中也有對應的實作,startswith對應startsWith,endswith對應endsWith。差別在于,Java中的實作不支援設定結束位置坐标。

下面為對應的示例代碼:

s = "hello world, are you ok"
print("該字元串是否以hello打頭:", s.startswith("hello"))
print("該字元串從下标5開始到結尾,是否存在以hello打頭的子串:", s.startswith("hello", 5))

print("該字元串是否以ok結尾:", s.endswith("ok"))
print("該字元串從開始到倒數第三的下标的子串是否以ok結尾:", s.endswith("ok", 0, -3))           

執行結果如下:

Python字元串類型介紹
  • isalpha、isdigit、isalnum和isspace

這四個函數用于對字元串是否為字母或數字進行判斷。其中,isalpha用于判斷該字元串非空且全部為字母,isdigit用于判斷該字元串是否非空且全部為數字,isalnum用于判斷該字元串是否非空且全部為數字或字母,ispace則用于判斷該字元串是否全部為空白字元。

其文法格式為:

# isalpha
字元串.islapha()
# isdigit
字元串.isdigit()
# isalnum
字元串.isalnum()
# isspace
字元串.isspace()           

下面給出對應的示例:

s1 = "hello"
s2 = "12345"
s3 = "hello12345"
s4 = "hello12345_"

print("s1是否非空且全部為字母:", s1.isalpha())
print("s2是否非空且全部為字母:", s2.isalpha())
print("s3是否非空且全部為字母:", s3.isalpha())
print("s4是否非空且全部為字母:", s4.isalpha())

print("s1是否非空且全部為數字:", s1.isdigit())
print("s2是否非空且全部為數字:", s2.isdigit())
print("s3是否非空且全部為數字:", s3.isdigit())
print("s4是否非空且全部為數字:", s4.isdigit())

print("s1是否非空且全部為字母或數字:", s1.isalnum())
print("s2是否非空且全部為字母或數字:", s2.isalnum())
print("s3是否非空且全部為字母或數字:", s3.isalnum())
print("s4是否非空且全部為字母或數字:", s4.isalnum())

s5 = "a b c d "
s6 = " "
print("s5是否全部為非空字元:", s5.isspace())
print("s6是否全部為非空字元:", s6.isspace())           

執行結果如下:

Python字元串類型介紹

仔細觀察,可以發現Python中判斷是否數字的函數除isdigit外,還有兩個,分别是:isnumeric和isdecimal。這三者的差別在于,isdigit判斷的是是否為數字字元,其認為合法的字元有:Unicode數字和數字,但不包括羅馬數字、漢字數字及小數;isnumeric判斷的是是否為數值字元,包括:Unicode數字、數字、漢字數字,但卻不包括小數和羅馬數字,當然,也有說包含羅馬數字的,但我嘗試後發現并不包含;isdecimal則判斷的是是否為十進制數字字元,包括:Unicode數字、數字,但不包括羅馬數字、漢字數字和小數。

下面給出對應的示例:

s1 = "123"
s2 = "3.14"
s3 = "IV"
s4 = "十貳"

print(s1, "是否為digit:", s1.isdigit())
print(s2, "是否為digit:", s2.isdigit())
print(s3, "是否為digit:", s3.isdigit())
print(s4, "是否為digit:", s4.isdigit())

print(s1, "是否為decimal:", s1.isdecimal())
print(s2, "是否為decimal:", s2.isdecimal())
print(s3, "是否為decimal:", s3.isdecimal())
print(s4, "是否為decimal:", s4.isdecimal())

print(s1, "是否為numerical:", s1.isnumeric())
print(s2, "是否為numerical:", s2.isnumeric())
print(s3, "是否為numerical:", s3.isnumeric())
print(s4, "是否為numerical:", s4.isnumeric())

print("iii")           

執行結果如下:

Python字元串類型介紹
  • isupper、islower和istitle

isupper用于判斷字元串是否全部為大寫,islower用于判斷字元串是否全部為小寫,istitle則用于判斷字元串的各單詞的首字母是否大寫。下面為對應的文法格式:

# isuppper
字元串.isupper
# islower
字元串.islower
# istitle
字元串.istitle           

下面為對應的例子:

s1 = "Tom and Jerry"
s2 = "this is a boy"
s3 = "GOOD"
s4 = "Oh, My God"
print(s1, "是否全部為小寫: ", s1.islower())
print(s2, "是否全部為小寫: ", s2.islower())
print(s3, "是否全部為小寫: ", s3.islower())
print(s4, "是否全部為小寫: ", s4.islower())

print(s1, "是否全部為大寫: ", s1.isupper())
print(s2, "是否全部為大寫: ", s2.isupper())
print(s3, "是否全部為大寫: ", s3.isupper())
print(s4, "是否全部為大寫: ", s4.isupper())

print(s1, "是否各單詞為首字母大寫: ", s1.istitle())
print(s2, "是否各單詞為首字母大寫: ", s2.istitle())
print(s3, "是否各單詞為首字母大寫: ", s3.istitle())
print(s4, "是否各單詞為首字母大寫: ", s4.istitle())           

執行結果如下:

Python字元串類型介紹