首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python str.index() 完整教學:子字串定位與異常處理

     編輯:更多程式設計知識

str.index() 與 str.find() 功能相似,皆回傳子字串首次出現的索引。關鍵差別在於:**找不到時 index() 拋出 ValueError 異常**,而 find() 回傳 -1。本文詳細說明語法、參數、異常處理模式、適用場景與最佳實踐。

方法簽名


str.index(sub[, start[, end]]) -> int
  • sub:搜尋目標子字串。
  • start:起始索引(含),預設 0。
  • end:結束索引(不含),預設字串長度。
  • 回傳:索引 (int)。
  • 異常:ValueError: substring not found。

基本範例


text = "abcdefghijklmnop"
print(text.index("def"))      # 3
print(text.index("def", 4))   # ValueError (從索引 4 開始找不到)
print(text.index("xyz"))      # ValueError

核心差異:find vs index

特性find()index()
找到時回傳索引回傳索引
找不到時回傳 -1拋 ValueError
適用邏輯條件判斷、可選搜尋斷言必須存在、契約式設計
效能相同 (C 層實現)相同

異常處理模式

1. try/except 捕獲(標準做法)


def find_mandatory(text, keyword):
    try:
        return text.index(keyword)
    except ValueError:
        raise ValueError(f"必要關鍵字 '{keyword}' 不存在於文本中")

# 使用
pos = find_mandatory("error: disk full", "error:")  # 0
# pos = find_mandatory("warning: low mem", "error:")  # 拋出自訂異常

2. 先用 in 判斷再呼叫(避免異常開銷)


if keyword in text:
    pos = text.index(keyword)  # 保證不會拋異常
else:
    handle_missing(keyword)

3. 封裝為安全版本


def safe_index(text, sub, default=-1):
    try:
        return text.index(sub)
    except ValueError:
        return default

print(safe_index("abc", "x"))        # -1
print(safe_index("abc", "x", None))  # None

進階用法:start/end 切片搜尋


log = "[2024-01-15 10:30:00] ERROR: Connection timeout"
# 只在括號內找時間格式
start = log.find('[') + 1
end = log.find(']')
timestamp = log[start:end]  # "2024-01-15 10:30:00"

# 或直接用 index 限定範圍
# log.index(':', start, end)  # 找第一個冒號

列表/元組也有 index()


lst = ['a', 'b', 'c', 'b']
print(lst.index('b'))      # 1
print(lst.index('b', 2))   # 3 (從索引 2 開始找)
# lst.index('x')           # ValueError

適用場景決策樹

需要索引位置?
├─ 找不到是「正常情況」 → 用 find(),檢查 != -1
├─ 找不到是「程式邏輯錯誤/資料不完整」 → 用 index(),讓異常往上拋
└─ 只需判斷存在性 → 用 in 運算子(最快、最清晰)

常見錯誤

  • 未捕獲 ValueError 導致腳本中止:在主流程呼叫 index() 時務必確認子字串必定存在,或包裝 try/except。
  • 混淆字串與列表:列表 index() 參數是**元素**,不支援切片參數 start/end(Python 3.10+ 列表才支援)。
  • 效能誤區:以為 index() 比 find() 快,實則相同;異常拋出反而有額外開銷。

一鍵測試腳本


import sys

def demo(text, sub):
    print(f"Text: {text!r}")
    print(f"Sub : {sub!r}")
    print(f"find: {text.find(sub)}")
    try:
        print(f"index: {text.index(sub)}")
    except ValueError as e:
        print(f"index: ValueError - {e}")
    print("-" * 40)

if __name__ == '__main__':
    if len(sys.argv) == 3:
        demo(sys.argv[1], sys.argv[2])
    else:
        demo("hello world", "world")
        demo("hello world", "python")
        demo("abcabc", "bc")

理解 index() 「找不到即異常」的契約語意,能讓代碼意圖更明確:用 find 處理可選搜尋,用 index 斷言必要結構,配合 try/except 在適當層級處理異常,寫出健壯且可維護的字串處理邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved