使用者: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"
也是可以的。
查找子字符串在父字符串中的位置
編輯str.find(sub[, start[, end]])
。它的意思是,可以用以下方式輸入:
str.find(sub, start, end)
可選的部分全部輸入。str.find(sub, start)
不輸入[, end]
的部分。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
。
關於 start
和 end
這兩個參數,用以下方式可能更好理解。這兩個方式輸出的結果是相同的:
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)
編輯=
是另一種表示可選參數的方式,與方括號的方式不同,該方式同時給出了不使用該參數時,參數的默認值。以左邊的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
,但在指定 maxsplit
且 maxsplit
的值不為 -1
時,會從右往左分割 maxsplit
次。比如:
print("a-ddd-b-ddd-c".split("-ddd-")) #输出:['a-ddd-b', 'c']
str.splitlines(keepends = False)
編輯返回由原字符串中各行組成的列表。每一項為一行的內容,不包含換行符。
如果 keepends
為 True
,則每一行為一行的內容,包含換行符。
以下字符會被視為是換行符:
換行符 | 描述 |
---|---|
\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]])
編輯若字符串 str
以 prefix
為開頭,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
,若字符串 str
以 suffix
為結尾,str.endswith(suffix)
會返回 True
,否則返回False
。
str.removeprefix(prefix)
編輯若字符串 str
以 prefix
為開頭,則返回 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" 的字符。