Python 逆引き集 | 字列操作:文字列を検索する

Python Python
スポンサーリンク
スポンサーリンク

文字列を検索するとはどういうことか

Pythonで文字列を扱うとき、「この文字列の中に特定の単語が含まれているか」「どこに現れているか」「何回出てくるか」を調べたい場面はとても多いです。 ログ解析、エラーメッセージの判定、ユーザー入力のチェック、簡易フィルタリング、セキュリティ上の危険なパターン検出など、すべて「文字列検索」が土台になります。

ここでは、初心者向けに 文字列を検索する基本テクニック をステップバイステップで整理しながら、 in 演算子、find()index()startswith()endswith()count() などを、例題とテンプレートを交えて丁寧に解説していきます。

最も基本的な検索:in 演算子で「含まれているか」を調べる

in の基本的な使い方

text = "Pythonで文字列を検索します"
if "文字列" in text:
    print("『文字列』が含まれています")
Python

"部分文字列" in 全体の文字列 という形で書くことで、 「その部分文字列が含まれているかどうか」 を真偽値(True/False)で判定できます。

これは、

  • 条件分岐
  • フィルタリング
  • 簡易的なチェック などで最もよく使われる基本テクニックです。

含まれていない場合

if "エラー" not in text:
    print("エラーという文字は含まれていません")
Python

not in を使うことで、「含まれていないこと」を条件にすることもできます。

深掘り:in のメリット

  • 書き方が直感的で分かりやすい
  • True/False で返ってくるので条件分岐にそのまま使える
  • 位置は気にせず「含まれているかどうか」だけ知りたいときに最適

初心者のうちは、「まず in で存在チェック」 という感覚を持っておくと良いです。

位置を知りたいとき:find() でインデックスを取得する

find() の基本

text = "Pythonで文字列を検索します"
pos = text.find("文字列")
print(pos)  # 7(0から数えた位置)
Python

find() は、

  • 見つかった場合 → 最初に現れた位置(インデックス)
  • 見つからなかった場合 → -1 を返します。

見つからなかった場合の扱い

pos = text.find("エラー")
if pos == -1:
    print("『エラー』は見つかりませんでした")
else:
    print(f"『エラー』は位置 {pos} にあります")
Python

-1 が「見つからない」という特別な値なので、 「find() を使うときは必ず -1 チェックをセットで考える」 という習慣を持つことが大事です。

部分的な範囲を指定して検索する

text = "Pythonで文字列を検索します。文字列は重要です。"
pos = text.find("文字列", 10)  # 10文字目以降から検索
print(pos)
Python

find(検索文字列, 開始位置, 終了位置) のように、 検索範囲を絞ることもできます。

深掘り:find() を使う場面

  • 「どこにあるか」を知りたい
  • 見つかった位置からさらに処理したい(切り出しなど)
  • 見つからなかった場合も含めて判定したい

in は「あるかどうか」だけ、find() は「どこにあるか」まで知りたいときに使い分けます。

見つからないときはエラーにしたい:index()

index() の基本

text = "Pythonで文字列を検索します"
pos = text.index("文字列")
print(pos)  # 7
Python

index()find() と似ていますが、 見つからなかった場合に ValueError を送出する という違いがあります。

text = "Pythonで文字列を検索します"
pos = text.index("エラー")  # ❌ ValueError
Python

深掘り:index() を使う意図

  • 「見つからないことは想定していない」
  • 「見つからなかったら即エラーにしたい」

という場合に、 find() ではなく index() を使うことで、 「異常系を見逃さない」 コードになります。

ただし、初心者のうちは、

  • まず infind() に慣れる
  • エラー処理をきちんと書けるようになってから index() を使う というステップで進めると理解しやすいです。

先頭・末尾を検索する:startswith() と endswith()

startswith() で「先頭が一致するか」を調べる

text = "ERROR: データが不正です"

if text.startswith("ERROR"):
    print("エラーメッセージです")
Python

startswith() は、 「文字列が特定の文字列で始まっているかどうか」 を判定します。

ログやメッセージの種別判定などでよく使われます。

endswith() で「末尾が一致するか」を調べる

filename = "data.csv"

if filename.endswith(".csv"):
    print("CSVファイルです")
Python

endswith() は、 「文字列が特定の文字列で終わっているかどうか」 を判定します。

ファイル拡張子のチェックなどで頻繁に使われます。

深掘り:startswith()/endswith() のメリット

  • 「先頭」「末尾」という意図が明確
  • text[:5] == "ERROR" のような書き方より読みやすい
  • 複数の候補をまとめてチェックできる(タプルを渡せる)
if filename.endswith((".txt", ".md", ".log")):
    print("テキスト系のファイルです")
Python

出現回数を知りたい:count()

count() の基本

text = "Pythonで文字列を検索します。文字列は重要です。"
c = text.count("文字列")
print(c)  # 2
Python

count() は、 「指定した部分文字列が何回出てくるか」 を返します。

深掘り:count() を使う場面

  • 危険なキーワードが何回出ているかをチェックする
  • ログ中の特定のタグの出現回数を数える
  • テキスト解析の簡易的な指標として使う

例えば、

if text.count("DROP TABLE") > 0:
    print("危険なSQLが含まれています")
Python

のように、 セキュリティチェックにも応用できます。

セキュリティと品質の観点から見た「文字列検索」の重要性

1. 危険なパターンの検出

ユーザー入力や外部データの中に、

  • SQLインジェクションのパターン
  • コマンドインジェクションのパターン
  • XSS(スクリプト)のパターン

などが含まれていないかをチェックする際に、 文字列検索は基本的な防御手段になります。

query = "SELECT * FROM users; DROP TABLE users;"

if "DROP TABLE" in query:
    print("危険なクエリです")
Python

もちろん、実務ではもっと高度な対策が必要ですが、 「危険な文字列が含まれているかどうかを検索する」 という発想は、セキュリティの入り口として非常に重要です。

2. ログやメッセージの分類

log = "WARN: メモリ使用量が高くなっています"

if log.startswith("ERROR"):
    level = "error"
elif log.startswith("WARN"):
    level = "warning"
else:
    level = "info"
Python

文字列検索を使ってログの種別を判定することで、

  • 重要度に応じた処理
  • 通知の優先度分け などが可能になります。

3. 入力バリデーション

comment = "これはテストです<script>alert('xss')</script>"

if "<script>" in comment:
    print("危険な入力です")
Python

単純なチェックでは不十分な場合もありますが、 「特定の文字列が含まれているかどうか」 を見ることは、 バリデーションの一部として有効です。

文字列検索のテンプレートと練習用コード

存在チェックテンプレート(in)

def contains_error(text):
    return "ERROR" in text
Python

位置取得テンプレート(find)

def find_first(text, keyword):
    pos = text.find(keyword)
    if pos == -1:
        return "見つかりませんでした"
    return f"位置 {pos} に見つかりました"
Python

先頭・末尾チェックテンプレート

def is_error_log(line):
    return line.startswith("ERROR")

def is_csv_file(name):
    return name.endswith(".csv")
Python

出現回数カウントテンプレート

def count_keyword(text, keyword):
    return text.count(keyword)
Python

まとめ

  • 「含まれているかどうか」を調べるには in 演算子が最もシンプルで分かりやすいです。
  • 「どこにあるか」を知りたいときは find()、見つからないことをエラーにしたいときは index() を使います。
  • 先頭・末尾の判定には startswith()endswith() があり、ログやファイル名の判定に非常に便利です。
  • 出現回数を知りたいときは count() を使い、危険なキーワードの検出や簡易解析に応用できます。
  • 文字列検索は、入力バリデーション・ログ分類・セキュリティチェックなど、実務の多くの場面で重要な役割を果たします。

「文字列を検索する」という操作は、単なるテキスト処理ではなく、 システムの安全性や信頼性を支える基礎的な技術でもあります。 ここを丁寧に押さえておくことで、Pythonでの文字列処理が一段と実践的なものになっていきます。

タイトルとURLをコピーしました