文字列.find() / 文字列.index() / 文字列.count()
| 対応: | Python 2(2000) |
|---|
文字列内で部分文字列を検索し、位置を取得したり出現回数を調べるメソッドです。
構文
# 部分文字列が最初に見つかったインデックスを返す(見つからない場合は -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 を返します。 |
サンプルコード
str_find_basic.py
# find() で部分文字列の位置を探す
text = "Pythonは楽しいプログラミング言語です。Pythonを学ぼう。"
pos = text.find("Python")
print(pos)
# 存在しない文字列を検索すると -1 を返す
print(text.find("Ruby"))
# 検索開始位置を指定して2番目の "Python" を探す
second_pos = text.find("Python", 1)
print(second_pos)
# rfind() で右から検索する
print(text.rfind("Python"))
実行すると次のように出力されます。
python3 str_find_basic.py 0 -1 22 22
str_find_count.py
# count() で出現回数を数える
message = "綾波レイはNERVのパイロットです。綾波レイは寡黙です。綾波レイはアヤナミです。"
n = message.count("綾波レイ")
print(n)
# 重複しない出現回数を数える
print("aaaa".count("aa"))
# 検索範囲を指定する
text2 = "abcabcabc"
print(text2.count("a", 0, 5))
実行すると次のように出力されます。
python3 str_find_count.py 3 2 2
str_find_practical.py
# find() を使った条件分岐の例
email = "user@wp-p.info"
if email.find("@") != -1:
print("有効なメールアドレス形式です。")
else:
print("@ が含まれていません。")
# index() は見つからない場合に ValueError を発生させる
text = "Pythonは楽しいプログラミング言語です。Pythonを学ぼう。"
try:
pos2 = text.index("Java")
except ValueError:
print("Java は見つかりませんでした。")
# 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("ドメイン: " + domain)
実行すると次のように出力されます。
python3 str_find_practical.py 有効なメールアドレス形式です。 Java は見つかりませんでした。 HTTPS通信です。 ドメイン: wp-p.info
よくあるミス
よくあるミス1: find() の戻り値を bool のように扱う
find() は文字列が先頭(インデックス0)にある場合に 0 を返します。0 はPythonでは偽(falsy)なので、if text.find(...) と書くと先頭にある場合を「見つからなかった」と誤判定します。
mistake1_ng.py
text = "Pythonは楽しい"
# find() が 0 を返す(先頭にある)が、if 0: は偽なので分岐が逆になる
if text.find("Python"):
print("見つかりました")
else:
print("見つかりませんでした")
実行すると次のように出力されます。
python3 mistake1_ng.py 見つかりませんでした
mistake1_ok.py
text = "Pythonは楽しい"
# -1 との比較で正確に判定する
if text.find("Python") != -1:
print("見つかりました")
else:
print("見つかりませんでした")
実行すると次のように出力されます。
python3 mistake1_ok.py 見つかりました
よくあるミス2: index() の例外を処理しない
index() は文字列が見つからない場合に ValueError を発生させます。例外処理なしで使うと、見つからないケースでプログラムが停止します。見つからない可能性がある場合は try/except で囲むか、find() を使います。
mistake2_ng.py
text = "Pythonは楽しい"
# 見つからない場合に ValueError が発生してプログラムが停止する
pos = text.index("Java")
print(pos)
実行すると次のように出力されます。
python3 mistake2_ng.py ValueError: substring not found
mistake2_ok.py
text = "Pythonは楽しい"
# find() は見つからない場合に -1 を返すため、例外を避けたい場合に使える
pos = text.find("Java")
if pos != -1:
print("見つかりました: " + str(pos))
else:
print("見つかりませんでした")
# index() を使う場合は try/except で囲む
try:
pos2 = text.index("Java")
except ValueError:
print("見つかりませんでした")
実行すると次のように出力されます。
python3 mistake2_ok.py 見つかりませんでした 見つかりませんでした
概要
『find()』と『index()』の最大の違いは、文字列が見つからなかったときの挙動です。『find()』は -1 を返しますが、『index()』は『ValueError』例外を発生させます。find()は見つからない場合に-1を返すため、例外を避けたい場合に適しています。
単に文字列が含まれるかどうかを確認したいだけなら、『find()』より『in』演算子の方が簡潔で読みやすいコードになります。位置(インデックス)が必要な場合にのみ『find()』を使えます。
正規表現を使った高度なパターン検索には標準ライブラリの『re』モジュールを使います。『re.search(pattern, string)』でパターンにマッチした位置を取得でき、より複雑な検索条件を扱えます。文字列の前後一致確認には『str.startswith() / str.endswith()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。