HOWTO · Python
在 Python 中的字串中查詢字元
本教程演示如何查詢字串中字元的位置
本頁內容
Python 字串索引從 0 開始。若要尋找字元或子字串,可用 find() 找第一個符合項目、用 rfind() 找最後一個符合項目,或在找不到時應引發 ValueError 的情況下使用 index()。找不到符合項目時,find() 和 rfind() 都會傳回 -1。若要收集所有符合項目的索引,可使用 enumerate() 逐一走訪字串。以下程式碼範例已在提供的 Python 執行環境中執行,各節也會說明實際觀察到的結果。
這些方法會搜尋字串,且區分大小寫。每個方法都接受要搜尋的值,以及選用的 start 和 end 範圍:包含 start,但不包含 end。例如,s.find("n", 6, 13) 只會搜尋從索引 6 到索引 12 的切片。傳回的索引是以原始字串開頭為基準,而不是相對於搜尋切片的位置。
使用 find() 方法尋找第一個符合項目並處理找不到的情況
在字串上呼叫 find(),並傳入要尋找的字元或子字串。它會由左至右傳回第一個符合項目的索引。如果找不到該值,就會傳回 -1;因此,將結果用作索引前,請先檢查是否為 -1。
對於 s = "python is fun" 和 c = "n",s.find(c) 會傳回 5:第一個 n 位於從 0 起算的索引 5。此方法的一般形式為 string.find(substring, start, end);省略選用的範圍參數時,就會搜尋整個字串。
以下是尋找第一個符合項目的完整範例:
s = "python is fun"
c = "n"
print(s.find(c))
此範例從 s 的開頭開始搜尋,列印結果為 5。若搜尋結果可能不存在,可先使用 position = s.find(c),再以 if position != -1: 之類的條件明確處理找不到的情況。
使用 rfind() 方法尋找最後一個符合項目
需要尋找字元或子字串最後一次出現的位置時,請使用 rfind()。它會從右側開始搜尋,並傳回符合項目中最大的索引;不過索引本身仍是從左側起算。和 find() 一樣,它接受選用的 start 和 end 範圍,找不到符合項目時會傳回 -1。
對於相同的字串和字元,s.rfind(c) 會傳回 12,也就是 "python is fun" 中最後一個 n 的索引。此方法的一般形式為 string.rfind(substring, start, end)。
s = "python is fun"
c = "n"
print(s.rfind(c))
這裡的結果是 12。最早出現的位置較重要時選擇 find();最晚出現的位置較重要時選擇 rfind()。即使找不到搜尋值,這兩個方法都不會因此引發錯誤。
使用 index() 方法處理找不到項目時應引發錯誤的情況
index() 也會傳回第一個符合項目的索引,並接受相同的選用 start 和 end 範圍。它和 find() 的主要差異在於找不到項目時的行為:若字元或子字串不存在,index() 會引發 ValueError,而不是傳回 -1。當找不到項目應視為錯誤時,請使用 index();若要透過傳回值檢查是否找不到,則使用 find()。
對於 s = "python is fun" 和 c = "n",s.index(c) 會傳回 5。此方法的一般形式為 string.index(substring, start, end)。
s = "python is fun"
c = "n"
print(s.index(c))
此範例會搜尋第一個 n,因此結果是 5。不要說找不到時 index() 會傳回 ValueError:此方法是引發該例外;若適用,呼叫端可以用 try/except 陳述式處理。
使用 for 迴圈搭配 enumerate() 尋找所有符合項目的索引
find()、rfind() 和 index() 都只會傳回一個符合項目的索引。若要找出所有出現位置,可搭配 enumerate() 逐一走訪字串;它會將每個字元與其從 0 起算的索引配對。字元符合要搜尋的值時,就將該索引加入清單。
s = "python is fun"
c = "n"
lst = []
for pos, char in enumerate(s):
if char == c:
lst.append(pos)
print(lst)
在這個字串中,符合項目的索引是 [5, 12]:兩個 n 分別位於索引 5 和 12。也可以用內嵌的串列推導式 [pos for pos, char in enumerate(s) if char == c] 得到相同結果。當不需要另外撰寫迴圈主體時,這種寫法能將走訪與符合條件放在一起。
這兩種寫法都會依序檢查字元,並使用相同的從 0 起算索引。每次符合時還要執行其他操作,請選擇迴圈;若只需要收集符合項目的索引,則可使用串列推導式。