使用者: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" 的字符。

參考文獻

編輯