Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Python辞典

  1. トップページ
  2. Python辞典
  3. 文字列.find() / 文字列.index() / 文字列.count()

文字列.find() / 文字列.index() / 文字列.count()

文字列内で部分文字列を検索し、位置を取得したり出現回数を調べるメソッドです。

構文
# 部分文字列が最初に見つかったインデックスを返します。見つからない場合は -1 を返します。
文字列.find(検索文字列, 開始=0, 終了=len(文字列))

# 右側(末尾)から検索します。
文字列.rfind(検索文字列, 開始=0, 終了=len(文字列))

# find() と同様ですが、見つからない場合は ValueError を発生させます。
文字列.index(検索文字列, 開始=0, 終了=len(文字列))

# 右側から検索する index() です。
文字列.rindex(検索文字列, 開始=0, 終了=len(文字列))

# 部分文字列の出現回数を返します。
文字列.count(検索文字列, 開始=0, 終了=len(文字列))
関数一覧
メソッド概要
str.find(sub, start, end)部分文字列 sub が最初に見つかったインデックスを返します。見つからない場合は -1 を返します。
str.rfind(sub, start, end)部分文字列 sub が最後に見つかったインデックスを返します(右から検索)。見つからない場合は -1 を返します。
str.index(sub, start, end)find() と同様ですが、見つからない場合に -1 ではなく ValueError を発生させます。
str.rindex(sub, start, end)rfind() と同様ですが、見つからない場合に ValueError を発生させます。
str.count(sub, start, end)部分文字列 sub の重複しない出現回数を返します。見つからない場合は 0 を返します。
サンプルコード
# find() で部分文字列の位置を探します。
text = "Pythonは楽しいプログラミング言語です。Pythonを学ぼう。"
pos = text.find("Python")
print(pos)  # 0(最初に見つかった位置)

# 存在しない文字列を検索すると -1 を返します。
print(text.find("Ruby"))  # -1

# 検索開始位置を指定して2番目の "Python" を探します。
second_pos = text.find("Python", 1)  # インデックス1以降を検索します。
print(second_pos)  # 2番目の "Python" の位置が返ります。

# rfind() で右から検索します。
print(text.rfind("Python"))  # 最後の "Python" の位置を返します。

# find() を使った条件分岐の例です。
email = "user@example.com"
if email.find("@") != -1:
    print("有効なメールアドレス形式です。")
else:
    print("@ が含まれていません。")

# index() は見つからない場合に ValueError を発生させます。
try:
    pos2 = text.index("Java")
except ValueError:
    print("Java は見つかりませんでした。")

# count() で出現回数を数えます。
message = "バナナが好きです。バナナはおいしい。バナナはビタミンが豊富です。"
n = message.count("バナナ")
print(n)  # 3

# 重複しない出現回数を数えます。
print("aaaa".count("aa"))  # 2("aa" が重複しない範囲で2回)

# 検索範囲を指定します。
text2 = "abcabcabc"
print(text2.count("a", 0, 5))  # インデックス0〜4の範囲で "a" を数えます。

# in 演算子との使い分けです。
# 位置が不要で「含まれるかどうか」だけを確認する場合は in が簡潔です。
url = "https://example.com"
if "https" in url:
    print("HTTPS通信です。")

# 位置が必要な場合は find() を使います。
at_pos = email.find("@")
if at_pos != -1:
    domain = email[at_pos + 1:]  # @ の後ろがドメインです。
    print(f"ドメイン: {domain}")
概要

『find()』と『index()』の最大の違いは、文字列が見つからなかったときの挙動です。『find()』は -1 を返しますが、『index()』は ValueError 例外を発生させます。存在しない可能性がある文字列を検索する場合は、例外処理を書かなくてよい『find()』の方が使いやすいです。

単に文字列が含まれるかどうかを確認したいだけなら、『find()』より『in』演算子の方が簡潔で読みやすいコードになります。位置(インデックス)が必要な場合にのみ『find()』を使いましょう。

正規表現を使った高度なパターン検索には標準ライブラリの『re』モジュールを使います。『re.search(pattern, string)』でパターンにマッチした位置を取得でき、より複雑な検索条件を扱えます。文字列の前後一致確認には『str.startswith() / str.endswith()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。