跳至內容

用戶:Xyy23330121/Python/字符串的操作

來自維基學院


Python 為字符串添加了許多有意思的操作。迫於篇幅原因,這裏另起一個頁面。

在初次閱讀時,只要掌握本頁面的in / not in以及 str.find 即可。與其熟記以下全部內容,等需要操作的時候再來查閱是更有效的方法。

簡單操作

[編輯 | 編輯原始碼]

這些操作比較簡單,因為讀者不需要學習 Unicode 對各個字符的定義或屬性即可正常使用。

判斷子字符串

[編輯 | 編輯原始碼]

in / not in

[編輯 | 編輯原始碼]

以下語句被用於判斷字符串是否為另一字符串的子字符串:

print("Py" in "Python")      #输出:True
print("Py" not in "Python")  #输出:False

如果讀者在之前章節學習比較運算符時看了文檔。不難發現 Python 將 in 和 not in 視為是比較運算符的一種。因此,比較運算符的並聯,比如 "Py" in "Python" not in "ABCDE" 也是可以的。

查找子字符串在父字符串中的位置

[編輯 | 編輯原始碼]
提示
在 Python 文檔中,用方括號括起來的部分,代表「可選的部分」。在使用時,可以不輸入這部分內容。比如左邊的str.find(sub[, start[, end]])。它的意思是,可以用以下方式輸入:
  1. str.find(sub, start, end)
    可選的部分全部輸入。
  2. str.find(sub, start)
    不輸入 [, end] 的部分。
  3. str.find(sub)
    不輸入[, start[, end]]

這種表示方法下,str代表讀者創建的一個字符串,在使用時需要替換為字符串的內容,比如:

a = "Python"
index = a.find("y")

或者:

index = "Python".find("y")

而非直接使用str

如果是直接使用str的情況,它會寫作[1]

classmethod int.from_bytes(bytes, byteorder='big', *, signed=False)

或者,對於類型名稱已經很明顯時,寫作[2]

classmethod fromhex(string)

本教程之後的內容都將採用 Python 文檔的方法。

str.find(sub[, start[, end]])

[編輯 | 編輯原始碼]

str.find(sub)會尋找 str 中,從左往右第一個子字符串 sub 的首字符索引。如果沒有找到,返回-1

關於 startend 這兩個參數,用以下方式可能更好理解。這兩個方式輸出的結果是相同的:

str.find(sub, start, end)
str[start:end].find(sub)

考慮到程序運行耗時,如果只是要確定子字符串是否在字符串之中,Python 更建議使用sub in str的方式。

str.rfind(sub[, start[, end]])

[編輯 | 編輯原始碼]

類似 str.find ,但它會尋找 str 中,從右往左第一個子字符串 sub 的首字符索引。

str.index(sub[, start[, end]])

[編輯 | 編輯原始碼]

類似 str.find ,但是在找不到的時候,會觸發ValueError

str.rindex(sub[, start[, end]])

[編輯 | 編輯原始碼]

類似 str.rfind ,但是在找不到的時候,會觸發ValueError

計數子字符串出現的次數

[編輯 | 編輯原始碼]

str.count(sub[, start[, end]])

[編輯 | 編輯原始碼]

str.count(sub) 會尋找字符串 str 中,子字符串 sub 出現的次數。比如:

print("Python".count("y"))   #输出:1
print("aaaaaa".count("aa"))  #输出:3 被计数的sub之间,两两不会重合。
print("Python".count(""))    #输出:7 输入空字符串时,会返回len(str) + 1。

類似 str.find,以下兩個方式輸出的結果是相同的:

str.count(sub, start, end)
str[start:end].count(sub)

str.replace(old, new[, count])

[編輯 | 編輯原始碼]

返回 str 中,所有子字符串 old 都被轉換成 new 的副本。如果指定了 count ,則最多替換從左往右的 count 個子字符串。有以下示例:

print("aaaa".replace("a","12"))   #输出:12121212
print("aaaa".replace("aa","1"))   #输出:11
print("aaaa".replace("a","1",3))  #输出:111a

拼接與拆分

[編輯 | 編輯原始碼]

str.join(iterable)

[編輯 | 編輯原始碼]

iterable 需要是一個由字符串組成的可迭代序列。str.join(iterable) 會返回把 iterable 中的所有拼接在一起的字符串;拼接時,會把 str 作為分隔符。有以下示例:

print("-ddd-".join(["a","b","c"])) #输出:a-ddd-b-ddd-c

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

[編輯 | 編輯原始碼]
提示
在 Python 文檔中,符號 = 是另一種表示可選參數的方式,與方括號的方式不同,該方式同時給出了不使用該參數時,參數的默認值。以左邊的str.split(sep = None, maxsplit = -1)為例:
  • 讀者可以不使用參數 sep,此時,sep 會取默認值None
  • 讀者可以不使用參數 maxsplit,此時,maxsplit 會取默認值-1

從而,使用str.split()等同於使用str.split(None, -1)

None 是 Python 中表示「空」的類型(對應其它一些語言中的 Null )。讀者無需特別掌握該類型。

返回字符串被按分割符 split 分割後的列表。比如:

print("a-ddd-b-ddd-c".split("-ddd-")) #输出:['a', 'b', 'c']

如果指定了 maxsplit,使 maxsplit 的值不為 -1。則最多從左往右分割 maxsplit 次。比如:

print("a-ddd-b-ddd-c".split("-ddd-",1)) #输出:['a', 'b-ddd-c']

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

[編輯 | 編輯原始碼]

類似str.split,但在指定 maxsplitmaxsplit 的值不為 -1 時,會從右往左分割 maxsplit 次。比如:

print("a-ddd-b-ddd-c".split("-ddd-")) #输出:['a-ddd-b', 'c']

str.splitlines(keepends = False)

[編輯 | 編輯原始碼]

返回由原字符串中各行組成的列表。每一項為一行的內容,不包含換行符。

如果 keependsTrue,則每一行為一行的內容,包含換行符。

以下字符會被視為是換行符:

換行符 描述
\n 換行
\r 回車
\r\n 回車 + 換行
\v 或 \x0b 行制表符
\f 或 \x0c 換表單
\x1c 文件分隔符
\x1d 組分隔符
\x1e 記錄分隔符
\x85 下一行 (C1 控制碼)
\u2028 行分隔符
\u2029 段分隔符

str.partition(sep)

[編輯 | 編輯原始碼]

返回有三個元素的元組。看以下示例:

print("a-ddd-b-ddd-c".partition("-ddd-")) #输出:('a','-ddd-','b-ddd-c')
print("a-ddd-b-ddd-c".partition("-ded-")) #输出:('a-ddd-b-ddd-c','','')

若上面示例不夠清楚,下面的代碼可能有所幫助。它返回的內容等同於:

(s[:end if (end:=s.find(sep)) != -1 else (end:=len(s))],
 s[end:end+len(sep)],
 s[end+len(sep):])

str.rpartition(sep)

[編輯 | 編輯原始碼]

類似str.partition。返回有三個元素的元組,但是是從右往左進行的。看以下示例:

print("a-ddd-b-ddd-c".rpartition("-ddd-")) #输出:('a-ddd-b','-ddd-','c')
print("a-ddd-b-ddd-c".rpartition("-ded-")) #输出:('','','a-ddd-b-ddd-c')

與字符串開頭/結尾內容有關的操作

[編輯 | 編輯原始碼]

str.startswith(prefix[, start[, end]])

[編輯 | 編輯原始碼]

若字符串 strprefix 為開頭,str.startswith(prefix) 會返回 True,否則返回False。比如:

print("Python".startswith("Py"))      #输出:True
print("Python".startswith("th"))      #输出:False

類似 str.find,以下兩個方式輸出的結果是相同的:

str.startswith(prefix, start, end)
str[start:end].startswith(prefix)

str.endswith(suffix[, start[, end]])

[編輯 | 編輯原始碼]

類似 str.startswith ,若字符串 strsuffix 為結尾,str.endswith(suffix) 會返回 True,否則返回False

str.removeprefix(prefix)

[編輯 | 編輯原始碼]

若字符串 strprefix 為開頭,則返回 str 移除開頭的 prefix 後的副本。比如:

print("Python".removeprefix("Py"))      #输出:thon
print("Python".removeprefix("th"))      #输出:Python

str.removesuffix(suffix)

[編輯 | 編輯原始碼]

類似 str.removeprefix。不過返回的是移除結尾的副本。

str.lstrip([chars])

[編輯 | 編輯原始碼]
提示
若左側說明不夠詳細,以下代碼可能對理解str.lstrip的作用有幫助。返回的結果等同於運行下面函數返回的結果:
def lstrip(str, char = " "):
    for index in range(len(str)):
        if str[index] not in chars:
            return str[index:]
    return ""
關於函數,參見之後的章節。

返回移除 str 開頭,所有在 chars 中列出字符的副本,直到出現未列出的字符為止。如果不輸入 chars ,默認移除空格。

print("abcaabbccdabc".lstrip("abc"))      #输出:dabc

str.rstrip([chars])

[編輯 | 編輯原始碼]

類似 str.lstrip 不過移除的是結尾的字符。

str.strip([chars])

[編輯 | 編輯原始碼]

類似 str.lstrip 但開頭和結尾的字符都會被移除。

居中與左右對齊

[編輯 | 編輯原始碼]

str.center(width[, fillchar])

[編輯 | 編輯原始碼]

str.center(width)會返回原字符串居中的副本。它會在字符串兩端填充空格,直到字符串長度達到或超過 width 為止。如果字符串長度本就大於 width ,它會直接返回字符串的副本。比如:

print("-","a".center(5),"-")  #输出:-   a   -
print("-","a".center(6),"-")  #输出:-   a    -
print("a12345678".center(5))  #输出:a12345678

fillchar 可以輸入一個長度為 1 的字符串(單個字符)。如果指定了 fillchar 兩端填充的將不是空格,而是 fillchar

str.ljust(width[, fillchar])

[編輯 | 編輯原始碼]

類似str.center,但返回的是原字符串居左的副本。

str.rjust(width[, fillchar])

[編輯 | 編輯原始碼]

類似str.center,但返回的是原字符串居右的副本。


複雜操作

[編輯 | 編輯原始碼]

Python 在設計這些操作的時候廣泛參考了 Unicode 標準,尤其是對各種語言的大小寫、各種語言的數字之類的標準。因此,比如在理解大小寫時,可以用英文字母的大小寫來理解,但不要狹義的以為只有英文字母有大小寫、或所有字符不是大寫、就是小寫。具體情況請參閱 Unicode 標準。

除此之外,也可以通過 unicodedata 模塊 來進行操作。

判斷大小寫

[編輯 | 編輯原始碼]

str.islower()

[編輯 | 編輯原始碼]

如果字符串中字符都是小寫,則返回 True。

str.isupper()

[編輯 | 編輯原始碼]

如果字符串中字符都是大寫,則返回 True。

str.istitle()

[編輯 | 編輯原始碼]

如果字符串的每個單詞的首字母都是大寫、而其餘字母都是小寫,則返回 True。

大小寫轉換

[編輯 | 編輯原始碼]

str.lower()

[編輯 | 編輯原始碼]

將所有字符轉換為小寫(如果有小寫形式)。

str.upper()

[編輯 | 編輯原始碼]

將所有字符轉換為大寫(如果有大寫形式)。

str.swapcase()

[編輯 | 編輯原始碼]

將小寫字符轉換為大寫,將大寫字符轉換為小寫。

要注意,由於 Unicode 標準的原因,多個小寫字符可能對應同一個大寫字符。這使得 str.swapcase().swapcase() 不一定與 str 相等。

str.capitalize()

[編輯 | 編輯原始碼]

將字符串的第一個字母轉換為大寫,其餘轉換為小寫。

str.title()

[編輯 | 編輯原始碼]

返回字符串中各個單詞首字母大寫的副本。

該方法將連續的字母組合視為單詞,因此 they're 由於引號分隔,會被轉換為 They'Re

str.casefold()

[編輯 | 編輯原始碼]

將所有字符轉換為小寫,且更為嚴格(如果有小寫形式)。在 Python 文檔中有以下示例:

德語小寫字母 'ß' 相當於 "ss"。 由於它已經是小寫了,lower() 不會對 'ß' 做任何改變;而 casefold() 則會將其轉換為 "ss"。

判斷字符類型

[編輯 | 編輯原始碼]

str.isalnum()

[編輯 | 編輯原始碼]

如果字符串中每個字符都是字母或數字,則返回 True

嚴格來講,如果 c.isalpha() , c.isdecimal() , c.isdigit() ,或 c.isnumeric() 之中有一個返回 True ,則字符 c 是字母或數字。

str.isalpha()

[編輯 | 編輯原始碼]

如果字符串中每個字符都是字母,則返回 True

字母指的是 Unicode 字符數據庫中被定義為 "Letter" 的字符,即具有通用類型屬性 "Lm", "Lt", "Lu", "Ll" 或 "Lo" 之一的字符。

str.isascii()

[編輯 | 編輯原始碼]

如果字符串中每個字符都是 ascii 字符,則返回 True

str.isdecimal()

[編輯 | 編輯原始碼]

如果字符串中每個字符都是十進制數字字符,則返回 True

十進制字符是 Unicode 通用類別 "Nd" 中的字符。

str.isidentifier()

[編輯 | 編輯原始碼]

如果字符串可以作為變量名,或是關鍵詞的名稱,則返回 True

str.isnumeric()

[編輯 | 編輯原始碼]

如果字符串中所有字符都是數值字符,則返回 True

數值字符就是 Unicode 數據庫中,具有特徵屬性值 Numeric_Type=Digit, Numeric_Type=Decimal 或 Numeric_Type=Numeric 的字符。

str.isprintable()

[編輯 | 編輯原始碼]

如果字符串中所有字符均為可打印字符或字符串為空則返回 True ,否則返回 False 。

不可打印字符指的是空格(\x20)以外的、在 Unicode 字符數據庫中被定義為 "Other" 或 "Separator" 的字符。

參考文獻

[編輯 | 編輯原始碼]