AI資格ドリル
資格を選ぶ↓

用語比較

str.find()とstr.index()の違い|見つからないとき -1 か ValueError か(Python3基礎)

文字列の find() と index() は、探した文字列が見つかったときは同じ値を返します。違いが出るのは見つからないときで、find() は -1 を返し、index() は ValueError を発生させます。

Python3エンジニア認定基礎試験で文字列を扱う問題を解くとき、この二つの戻り値の違いが選択肢になることがあります。メソッドの正確な決まりは、Python 公式ドキュメントの組み込み型(文字列のメソッド)の項に書かれています。

このページは、find() と index() のどちらを使うか迷った人と、-1 が返ったあとの扱いで間違えた人向けです。見つからないときの動きと、その後の落とし穴に絞って整理します。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。

結論

str.find(sub)

sub が見つかった最小の添字を返す。見つからなければ -1 を返す。

str.index(sub)

find() と同じ添字を返すが、見つからなければ ValueError を発生させる。

含まれるかだけ知りたいとき

公式ドキュメントは find() は位置を知りたいときだけ使い、含まれるかの確認には in 演算子を使うよう注記している。

違いを表で確認

比較軸str.find(sub)str.index(sub)
見つかったときfind():最小の添字を返す('spam, spam, spam'.find('sp') は 0)index():find() と同じ添字を返す('spam, spam, spam'.index('spam') は 0)
見つからないときfind():-1 を返す。例外は発生しないindex():ValueError(substring not found)を発生させる
探す範囲の指定find(sub, start, end):スライス記法と同じ解釈index(sub, start, end):find() と同じ引数
if 文での判定find() の 0 は偽、-1 は真として扱われるindex() は見つからないと例外になり、戻り値の真偽では判定しない

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

見つからないときにエラーで止まった人

index() は見つからないと ValueError を発生させます。止めたくないなら find() に替えるか、先に in 演算子で含まれるかを確かめます。

02

if s.find('sp'): と書いて逆の結果になった人

先頭で見つかると find() は 0 を返し、0 は偽として扱われます。見つからないときの -1 は真です。含まれるかの判定には in 演算子を使います。

03

-1 をそのまま添字に使ってしまった人

find() が返した -1 を添字にすると、文字列の末尾の文字を指します。エラーにならないので気づきにくい点に注意します。

具体例で使い分ける

例 1

見つかるとき・見つからないとき(公式ドキュメントの例)

s = 'spam, spam, spam' に対して、s.find('sp')、s.find('sp', 5)、s.find('eggs') を実行します。

  • find('sp') は最初の 'sp' の位置なので 0 です。
  • find('sp', 5) は添字 5 以降で探すので、次の 'sp' の位置 6 を返します。
  • 'eggs' は含まれないので -1 です。

結論: 答えは 0、6、-1 です。Python 3.9.6 で実行して同じ結果を確認しました。

例 2

index() で見つからないとき(公式ドキュメントの例)

同じ s に対して s.index('eggs') を実行します。

  • index() は find() と同じ検索をしますが、見つからないと例外を発生させます。
  • 発生する例外は ValueError で、メッセージは substring not found です。
  • try 文で受けない限り、プログラムはそこで止まります。

結論: 答えは ValueError です。Python 3.9.6 で実行して同じ結果を確認しました。

問題文から答えを選ぶ手順

  1. 1

    位置が必要かを確認する

    含まれるかだけを知りたいなら、find() ではなく in 演算子を使います。

  2. 2

    見つからないときの扱いを決める

    止めずに続けたいなら find()、見つからないことを異常として扱いたいなら index() を選びます。

  3. 3

    find() の戻り値は -1 を先に確認する

    -1 かどうかを調べてから添字として使います。0 は偽として扱われるので、戻り値をそのまま if に入れません。

試験での見分け方

  • 1find() も index() も、見つかったときは最小の添字を返す。
  • 2見つからないとき、find() は -1 を返し、index() は ValueError を発生させる。
  • 3含まれるかだけを調べるなら in 演算子を使う(公式ドキュメントの注記)。
  • 4find() の戻り値を if にそのまま入れない。先頭で見つかると 0 で偽になり、見つからない -1 は真になる。

誤答しやすい選択肢

find() は見つからないと例外になると思う

修正: 例外になるのは index() です。find() は -1 を返し、例外は発生しません。

find() の戻り値の真偽で含まれるかを判定する

修正: 先頭で見つかると 0 で偽、見つからないと -1 で真になり、逆の判定になります。in 演算子を使います。

見つからなかった -1 を添字に使う

修正: 'Python'['Python'.find('x')] は末尾の 'n' を返し、エラーにならずに誤った値が出ます。-1 を確かめてから使います。

確認問題

Q1'spam, spam, spam'.find('eggs') の結果は何ですか?

答え: -1

'eggs' は含まれないので、find() は例外を出さず -1 を返します。

Q2'spam, spam, spam'.index('eggs') を実行するとどうなりますか?

答え: ValueError が発生する

index() は find() と同じ検索で、見つからないときに ValueError(substring not found)を発生させます。

Q3'spam, spam, spam'.find('sp', 5) の結果は何ですか?

答え: 6

添字 5 以降で探すので、最初の 'sp'(添字 0)ではなく次の 'sp' の位置 6 が返ります。

到達チェック

  • find() は -1、index() は ValueError と言い分けられる
  • 見つかったときの戻り値は両方とも最小の添字だと言える
  • 含まれるかの確認には in 演算子を使うと説明できる
  • find() の戻り値を if に入れると逆になる理由を説明できる

同じ資格で次に知りたいこと

よくある質問

Qfind() と index() の違いは何ですか?

A

見つからないときの動きだけが違います。find() は -1 を返し、index() は ValueError を発生させます。

Q文字列が含まれるかだけ調べるにはどうしますか?

A

in 演算子を使います。公式ドキュメントは find() を位置が必要なときだけ使うよう注記しています。

Qfind() が 0 を返したときは見つかっていないのですか?

A

見つかっています。0 は先頭で見つかった位置です。見つからないのは -1 のときです。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)