🐍 Python
str.find(sub) / str.index(sub)
部分文字列subが最初に現れる位置(インデックス)を調べるメソッドです。見た目はよく似ていますが、見つからなかったときの挙動が正反対という重要な違いがあります。
構文: str.find(sub) # 見つからなければ -1 を返す
str.index(sub) # 見つからなければ ValueError
findの基本:見つからなければ-1
s = "hello world"
print(s.find("world")) # 6
print(s.find("python")) # -1(見つからない)
indexの基本:見つからなければ例外
findと書き方は同じですが、見つからないとValueErrorが発生します。「見つからないこと自体が異常事態」と扱いたい場面ではindexの方が適しています。
s = "hello world"
try:
print(s.index("python"))
except ValueError as e:
print("ValueError:", e)
# ValueError: substring not found
rfindで末尾側から検索する
rfindは末尾側から検索し、最後に現れた位置を返します。ファイル名から拡張子の区切りを探すときの定番です。
s = "a.b.c.txt"
print(s.rfind(".")) # 5(最後の"."の位置)
実用例:拡張子を取り出す
fname = "archive.tar.gz"
dot = fname.rfind(".")
print(fname[dot+1:]) # 'gz'
find系メソッドの一覧
- find(sub)
- 先頭側から検索。見つからなければ
-1 - rfind(sub)
- 末尾側から検索。見つからなければ
-1 - index(sub)
- 先頭側から検索。見つからなければ
ValueError - rindex(sub)
- 末尾側から検索。見つからなければ
ValueError
💡 「含まれているか」だけならin演算子の方が読みやすい
位置の数値自体が必要ないなら、s.find(sub) != -1やs.find(sub) >= 0のような書き方より、sub in sと書く方が意図が明確です。「-1という数値が『見つからない』を意味する」という仕様を知らないと読み間違えるコードなので、AIが生成したコードで真偽値だけが欲しい場面にfindが使われていたら、inへの書き換えを検討する価値があります。