Pythonでは、文章やデータの中に特定の文字列が含まれているか調べることができます。
例えば、入力された文章に禁止語が含まれていないか確認したり、メールアドレスに「@」があるか調べたりする場合です。
Pythonで文字列を検索する主な方法は、次のとおりです。
- 文字列が含まれているか調べる:「in演算子」
- 文字列が始まる位置を調べる:「find()」
- 見つからなかった場合をエラーにする:「index()」
- 文字列が登場する回数を調べる:「count()」
- 先頭や末尾を調べる:「startswith()」「endswith()」
この記事では、それぞれの違いと使い分けを初心者向けに解説します。
in演算子で文字列が含まれているか調べる
特定の文字列が含まれているか確認するだけなら、「in演算子」が簡単です。
text = "Pythonで文字列を検索します"
# 「文字列」が含まれているか確認
result = "文字列" in text
print(result) # True検索した文字列が含まれている場合は「True」、含まれていない場合は「False」が返されます。
条件分岐と組み合わせることもできます。
text = "今日はPythonを学習します"
# Pythonという文字列が含まれているか確認
if "Python" in text:
print("Pythonについて書かれています")
else:
print("Pythonは見つかりませんでした")「どこにあるかは必要なく、含まれているかだけ知りたい」という場合は、「in演算子」が読みやすい方法です。
文字列が含まれていないか調べる
文字列が含まれていないことを確認するには、「not in」を使います。
text = "今日は文字列を学習します"
# 「リスト」が含まれていないか確認
if "リスト" not in text:
print("リストという文字列は含まれていません")「in」は含まれているかを調べ、「not in」は含まれていないかを調べます。
否定の条件を複雑に書くより、「not in」を使うほうがコードの意図を読み取りやすくなります。
find()で文字列の位置を検索する
文字列が含まれている位置を知りたい場合は、「find()」を使います。
text = "Pythonで文字列を検索します"
# 「文字列」が始まる位置を検索
position = text.find("文字列")
print(position) # 8Pythonでは、文字の位置を「0」から数えます。
そのため、先頭の文字が見つかった場合の位置は「0」です。
「find()」が返すのは、検索した文字列の最初の文字がある位置です。
find()で見つからない場合
検索した文字列が見つからなかった場合、「find()」は「-1」を返します。
text = "Pythonを学習します"
# 含まれていない文字列を検索
position = text.find("Java")
print(position) # -1この性質を使って、文字列が見つかったか判断できます。
text = "Pythonを学習します"
position = text.find("Python")
# -1でなければ文字列が見つかっている
if position != -1:
print(f"{position}番目から見つかりました")
else:
print("見つかりませんでした")ただし、含まれているかどうかだけを調べたい場合は、「find()」よりも「in演算子」のほうが目的が伝わりやすくなります。
「検索位置が必要ならfind()、存在だけ知りたいならin」と使い分けるとよいでしょう。
find()の結果をそのまま条件にしない
初心者が注意したいのが、「find()」の結果をそのまま条件式にする書き方です。
text = "Pythonを学習します"
# この書き方では正しく判断できない
if text.find("Python"):
print("見つかりました")「Python」は文字列の先頭にあるため、「find()」の結果は「0」です。
Pythonの条件式では「0」が「False」として扱われるため、文字列が見つかっているのに処理が実行されません。
また、見つからなかった場合の「-1」は「True」として扱われます。
「find()」で存在を判断する場合は、必ず「-1」と比較します。
text = "Pythonを学習します"
# 検索結果を-1と比較する
if text.find("Python") != -1:
print("見つかりました")このような間違いを避けるためにも、存在確認だけなら「in演算子」を使うのがおすすめです。
index()で文字列の位置を検索する
「index()」も、文字列が始まる位置を取得するメソッドです。
text = "Pythonで文字列を検索します"
# 「検索」が始まる位置を取得
position = text.index("検索")
print(position) # 12文字列が見つかった場合の結果は、「find()」と同じです。
違いは、文字列が見つからなかった場合にあります。
text = "Pythonを学習します"
# 「Java」がないためエラーになる
position = text.index("Java")
print(position)「index()」では、検索した文字列が見つからないと「ValueError」が発生します。
確実に含まれているはずの文字列を探し、見つからない状態を異常として扱いたい場合に利用できます。
一方、見つからない可能性が通常の動作として考えられる場合は、「find()」や「in演算子」のほうが扱いやすいでしょう。
find()とindex()の違い
「find()」と「index()」の違いを整理すると、次のようになります。
- 見つかった場合:どちらも最初の位置を返す
- 見つからない場合の「find()」:「-1」を返す
- 見つからない場合の「index()」:「ValueError」が発生する
例えば、利用者が入力した文章から任意の単語を探す場合、見つからないことは珍しくありません。このような処理には、「find()」が向いています。
一方、決められた形式のデータに必ず含まれるはずの記号を探す場合は、「index()」によって形式の異常に気づけます。
「エラーが出ない方法が常に優れている」のではありません。「見つからない状態を通常として扱うか、異常として扱うか」で選ぶのがポイントです。
rfind()で右側から検索する
同じ文字列が複数ある場合、通常の「find()」は最初に見つかった位置を返します。
最後に登場する位置を調べるには、「rfind()」を使います。
text = "Python入門・Python演習・Python活用"
# 左側から最初に見つかった位置
first_position = text.find("Python")
# 右側から最初に見つかった位置
last_position = text.rfind("Python")
print(first_position) # 0
print(last_position) # 20「rfind()」も、文字列が見つからなかった場合は「-1」を返します。
ファイル名に複数のピリオドが含まれている場合など、最後に登場する記号を探したいときに便利です。
count()で文字列が登場する回数を調べる
特定の文字列が何回含まれているか調べるには、「count()」を使います。
text = "りんご、みかん、りんご、バナナ"
# 「りんご」が登場する回数を取得
count = text.count("りんご")
print(count) # 2検索した文字列が含まれていない場合は「0」が返されます。
text = "りんご、みかん、バナナ"
# 含まれていない果物を数える
count = text.count("ぶどう")
print(count) # 0「count()」は位置ではなく、登場回数を整数で返します。
文章内のキーワード数を調べたり、特定の記号が想定した数だけ含まれているか確認したりするときに利用できます。
startswith()で先頭の文字列を調べる
文字列が特定の内容から始まっているか確認するには、「startswith()」を使います。
url = "https://example.com"
# URLがhttpsから始まっているか確認
if url.startswith("https://"):
print("HTTPSのURLです")結果は「True」または「False」です。
「in演算子」は文字列全体から検索しますが、「startswith()」は先頭だけを調べます。
「どこかに含まれている」ことと「先頭にある」ことは意味が異なるため、目的に合わせて使い分けましょう。
endswith()で末尾の文字列を調べる
文字列が特定の内容で終わっているか確認するには、「endswith()」を使います。
file_name = "report.csv"
# ファイル名の末尾を確認
if file_name.endswith(".csv"):
print("CSVファイルです")複数の候補を指定することもできます。
file_name = "photo.png"
# いずれかの拡張子で終わるか確認
image_extensions = (".jpg", ".jpeg", ".png")
if file_name.endswith(image_extensions):
print("画像ファイルです")「startswith()」と「endswith()」は、文字列の形式を簡単に確認したい場合に便利です。
ただし、ファイルパスを本格的に扱う処理では、「pathlib」などの専用機能を使う方法もあります。
大文字と小文字は区別される
Pythonの文字列検索では、アルファベットの大文字と小文字が区別されます。
text = "I study Python"
# 大文字と小文字が異なる
print("Python" in text) # True
print("python" in text) # False大文字と小文字を区別せずに検索したい場合は、検索する側と検索される側を同じ形式に変換します。
text = "I study Python"
keyword = "python"
# 両方を小文字に変換してから検索
if keyword.lower() in text.lower():
print("見つかりました")より幅広い文字を扱う場合は、「lower()」の代わりに「casefold()」を使う方法もあります。
text = "I study PYTHON"
keyword = "python"
# 大文字と小文字の違いを吸収して検索
if keyword.casefold() in text.casefold():
print("見つかりました")英字を含む利用者入力を検索する場合は、「大文字と小文字を区別する必要があるか」を先に決めておきましょう。
検索範囲を指定する
「find()」では、検索を始める位置と終了する位置を指定できます。
text = "Python 基礎 Python 応用"
# 8番目以降から「Python」を検索
position = text.find("Python", 8)
print(position) # 10開始位置に「8」を指定しているため、先頭にある「Python」は検索対象になりません。
終了位置も指定できます。
text = "Python 基礎 Python 応用"
# 0番目以上10番目未満の範囲を検索
position = text.find("Python", 0, 10)
print(position) # 0範囲の終了位置は検索対象に含まれません。
文字列全体を毎回切り取らなくても、必要な範囲だけを検索できます。
複数のキーワードを検索する
複数のキーワードのうち、どれか一つでも含まれているか調べたい場合は、「any()」と組み合わせられます。
text = "今日はPythonの文字列を学習します"
keywords = ["リスト", "文字列", "辞書"]
# どれか一つでも含まれているか確認
if any(keyword in text for keyword in keywords):
print("対象のキーワードが見つかりました")すべてのキーワードが含まれているか調べる場合は、「all()」を使います。
text = "Pythonで文字列を検索します"
keywords = ["Python", "文字列", "検索"]
# すべて含まれているか確認
if all(keyword in text for keyword in keywords):
print("すべてのキーワードが見つかりました")検索するキーワードが増えても、「or」や「and」を何度も並べずに書けます。
文字列検索の方法をどう選ぶか
文字列を検索するときは、最初に「何を知りたいのか」を決めると、使用する方法を選びやすくなります。
- 含まれているか知りたい:「in」
- 含まれていないか知りたい:「not in」
- 最初に登場する位置を知りたい:「find()」
- 見つからない状態をエラーにしたい:「index()」
- 最後に登場する位置を知りたい:「rfind()」
- 登場する回数を知りたい:「count()」
- 先頭を確認したい:「startswith()」
- 末尾を確認したい:「endswith()」
文字列検索では、方法の多さよりも「検索結果を何に使うか」が重要です。
例えば、キーワードを含む文章だけを表示するなら、位置の情報は必要ありません。この場合は「in演算子」で十分です。
位置を使って文字列を切り出す場合には、「find()」が役立ちます。
必要のない情報まで取得しない書き方は、コードを短くするだけでなく、処理の目的を読み手へ伝えやすくします。
まとめ
Pythonで文字列を検索する最も簡単な方法は、「in演算子」を使うことです。
text = "Pythonで文字列を検索します"
# 指定した文字列が含まれているか確認
if "文字列" in text:
print("見つかりました")今回のポイントは次のとおりです。
- 存在を確認する場合は「in」
- 位置を取得する場合は「find()」
- 見つからない状態をエラーにする場合は「index()」
- 登場回数を取得する場合は「count()」
- 先頭と末尾の確認には「startswith()」「endswith()」
- 大文字と小文字を区別しない場合は、検索前に表記をそろえる
- 「find()」の結果を条件式へ直接入れない
大切なのは、「検索すること」ではなく「検索した結果をどのように使うか」です。
存在だけ分かればよいのか、位置や回数まで必要なのかを考えてから方法を選びましょう。最初は「in演算子」で存在を確認し、位置が必要になったときに「find()」を使うと理解しやすくなります。

