🐍 Python
in 演算子(部分文字列の判定)
ある文字列が別の文字列に含まれているかを調べるには、メソッドを呼ばずにin演算子を使うのが最もシンプルで読みやすい方法です。位置は分からず、真偽値(True/False)だけが欲しいときに使います。
構文: 部分文字列 in 文字列
戻り値: True または False
基本の使い方
s = "hello world"
print("world" in s) # True
print("python" in s) # False
not inで否定判定する
含まれていないことを調べたい場合はnot inを使います。not ("x" in s)と書くより自然に読めます。
print("xyz" not in s) # True
実用例:許可された拡張子かを検証する
allowed_ext = [".jpg", ".png", ".gif"]
fname = "photo.png"
ext = fname[fname.rfind("."):]
print(ext in allowed_ext) # True
大文字・小文字を区別する落とし穴
in演算子は完全一致で部分文字列を判定するため、大文字・小文字の違いも区別します。ユーザー入力を検証するコードでこの点を見落とすと、意図した文字列が含まれているのにFalseと判定されるバグになります。
s = "Hello World"
print("hello" in s) # False(大文字小文字が違う)
print("hello" in s.lower()) # True(両辺を小文字にそろえてから比較)
in演算子が使える対象
- 文字列
- 部分文字列が含まれているかを判定
- リスト・タプル
- 要素として存在するかを判定(
3 in [1, 2, 3]はTrue) - 辞書
- キーとして存在するかを判定(値ではない点に注意)
💡 位置も知りたいならfind/indexを使う
in演算子は「含まれているか」の真偽値しか教えてくれません。「どこに含まれているか」という位置情報も必要な場合はfind / indexを使います。AIが生成したコードでif sub in s:のあとにs.find(sub)を呼んで位置を再計算している場合、二度手間になっていないか(最初からfindだけで済ませられないか)を確認する価値があります。