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

用語比較

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

文字列の中で部分文字列の位置を調べる方法には、find() と index() があります。見つかったときの結果は同じで、違いは見つからなかったときです。

find() は -1 を返し、index() は ValueError を起こします。

このページは、find() の結果を if に使って逆の分岐になった人や、index() で ValueError が出て困った人向けです。決まりは、Python 公式ドキュメントの組み込み型(文字列メソッド)の項に書かれています。

この記事の根拠と出典

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

結論

s.find(sub)

最初に見つかった位置を返す。見つからなければ -1。

s.index(sub)

最初に見つかった位置を返す。見つからなければ ValueError。

sub in s

あるかどうかだけを True / False で返す。位置は分からない。

違いを表で確認

比較軸s.find(sub)s.index(sub)
見つかったとき(s = "banana"、sub は "na")s.find("na"):2s.index("na"):2
見つからないとき(sub は "x")s.find("x"):-1s.index("x"):ValueError: substring not found
リストに使えるかlist には find() が無く AttributeErrorlist にも index() があり、無い値は ValueError
後ろから探す版rfind():見つからなければ -1rindex():見つからなければ ValueError

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

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

PR

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

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

01

find() の結果をそのまま if に入れて、逆の分岐になった人

if s.find("x"): と書くと、見つからないときの -1 は 0 以外なので True になります。逆に、先頭で見つかったときの 0 は False になります。Python 3.9.6 では、s = "banana" で bool(s.find("b")) が False、bool(s.find("x")) が True でした。

02

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

見つからない -1 を s[-1] に使うと、エラーにならず末尾の文字が取れます。s = "banana" で s[s.find("x")] は 'a' でした。見つからない場合を先に分ける必要があります。

03

あるかどうかだけ知りたい人

公式ドキュメントは、find() は位置が必要なときだけ使い、部分文字列があるかどうかの確認には in 演算子を使うよう案内しています。"n" in s は True、"x" in s は False です。

具体例で使い分ける

例 1

見つからないときの find() と index()

s = "banana" に対して s.find("x") と s.index("x") を実行します。

  • 公式ドキュメントは、find() を最初に見つかった位置を返し、見つからなければ -1 を返すメソッドと説明しています。
  • index() は find() と同じですが、見つからないときに ValueError を起こすと説明されています。

結論: s.find("x") は -1 です。s.index("x") は ValueError: substring not found になります。Python 3.9.6 で同じ結果を確認しました。

例 2

探す範囲を start と end で区切る

s = "banana" に対して s.find("a", 2, 4) と s.find("a", 2, 3) を実行します。

  • start と end は、スライスと同じく s[start:end] の範囲を表します。
  • s[2:4] は "na"、s[2:3] は "n" です。位置は元の文字列の先頭から数えた値で返ります。

結論: s.find("a", 2, 4) は 3、s.find("a", 2, 3) は -1 です。Python 3.9.6 で同じ結果を確認しました。

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

  1. 1

    位置が必要かどうかを決める

    あるかどうかだけなら in 演算子です。位置が要るときだけ find() か index() を使います。

  2. 2

    見つからないことが普通か、異常かを決める

    見つからないのが普通なら find() で -1 を判定します。見つからないのが異常なら index() でエラーとして扱います。

  3. 3

    結果を使う前に -1 を分ける

    find() の結果は、-1 かどうかを == や != で比べてから添字や条件に使います。

試験での見分け方

  • 1s.find(sub) は見つからないと -1 を返す。
  • 2s.index(sub) は見つからないと ValueError を起こす。
  • 3あるかどうかだけなら sub in s を使う。
  • 4if s.find(sub): は先頭の 0 と未発見の -1 を取り違える。

誤答しやすい選択肢

if s.find(sub): で存在を判定する

修正: 先頭で見つかると 0 で False、見つからないと -1 で True になります。in 演算子か、s.find(sub) != -1 と書きます。

find() の -1 を添字にそのまま使う

修正: s[-1] は末尾の文字なので、エラーにならず誤った値が入ります。-1 かどうかを先に確かめます。

list に find() を使おうとする

修正: list に find() は無く、AttributeError になります。list.index() を使うか、in 演算子で確かめます。

確認問題

Q1s = "banana" のとき、s.find("x") は何ですか?

答え: -1

find() は見つからないと -1 を返します。

Q2s = "banana" のとき、s.index("x") を実行するとどうなりますか?

答え: ValueError

index() は見つからないと ValueError を起こします。

Q3s = "banana" のとき、if s.find("b"): の条件は True ですか、False ですか?

答え: False

"b" は先頭で見つかるので find() は 0 を返し、0 は False として扱われます。

到達チェック

  • find() は -1、index() は ValueError と言える
  • if s.find(sub): が危ない理由を言える
  • 存在確認には in 演算子を使うと言える
  • list には find() が無いと言える

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

よくある質問

Qfind() と index() はどちらを使うべきですか?

A

見つからないことが普通なら find()、見つからないのは異常として止めたいなら index() です。

Qrfind() と rindex() は何が違いますか?

A

探す向きが後ろからになる点を除き、見つからないときの扱いは find() と index() に対応します。rfind() は -1、rindex() は ValueError です。

Qどちらが速いですか?

A

このページでは速度を比べていません。見つからないときの扱いで選びます。

次に見る比較

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