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