非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【Python】リスト内包表記で文字列を抽出 — startswith()とin演算子

   

Pythonを使ったデータ処理において、テキストデータの中から特定の条件を満たす行を抽出する作業は頻繁に発生します。ログファイルの解析や、マークダウン形式のドキュメントから特定の情報を抜き出す際などその用途は多岐にわたります。Pythonに標準で備わっている文字列抽出に便利なメソッド「startswith()」と、部分文字列の存在をチェックする「in演算子」について解説します。

startswith() メソッドを使った行頭の抽出

startswith() メソッドは、文字列が特定のプレフィックス(接頭辞)で始まるかどうかを判定するために使用します。これは、たとえばMarkdown形式のドキュメントからリスト項目を抽出したり、ログファイルの中から特定の識別子で始まるメッセージを見つけたりするのに非常に有効です。

基本的な使い方は非常にシンプルで、文字列.startswith(プレフィックス) の形式で利用します。オプションで、検索を開始するインデックスを指定することも可能です。

# 複数行のテキストデータ
text_data = """
* これは重要な項目です。
通常のテキスト行です。
- リストの別の項目です。
# ヘッダー行です。
  インデントされた行です。
** これはアスタリスク2つで始まる項目です。
"""

print("--- startswith('*') の結果 ---")
# アスタリスクで始まる行を抽出
# 空行は除外するためにif lineを追加
filtered_by_startswith = [line for line in text_data.splitlines() if line.startswith('*') and line.strip() != '']
for line in filtered_by_startswith:
    print(line)

print("\n--- startswith('#') の結果 ---")
# シャープで始まる行(ヘッダーなど)を抽出
filtered_by_hash = [line for line in text_data.splitlines() if line.startswith('#') and line.strip() != '']
for line in filtered_by_hash:
    print(line)
 

 

出力例
--- startswith('*') の結果 ---
* これは重要な項目です。
** これはアスタリスク2つで始まる項目です。

--- startswith('#') の結果 ---
# ヘッダー行です。
 

 

この例では、startswith(‘*’) を使うことで、行の先頭がアスタリスクで始まる行のみを正確に抽出しています。** で始まる行も * で始まっているため、条件に合致します。

途中に*が入った行を抽出する (in演算子)

次に行の途中に特定の文字や文字列が含まれるかどうかをチェックしたい場合のテクニックです。このような場合は、startswith() ではなくPythonのin演算子を使用するのが適切です。in演算子は、ある文字列が別の文字列のどこかに含まれているかをシンプルに判定します。

これは、キーワード検索や、特定の記号が埋め込まれた行を特定する際に非常に役立ちます。

# 複数行のテキストデータ
another_text_data = """
これは通常のテキストです。
重要!この行には*特別な情報*が含まれています。
ログファイルのエラーコード: ERR_001
途中にアスタリスク*がある行です。
* これは行頭にアスタリスクがある行ですが、in演算子でも検出されます。
"""

print("--- '*' in line の結果 ---")
# 途中にアスタリスクが含まれる行を抽出
filtered_by_contains = [line for line in another_text_data.splitlines() if '*' in line and line.strip() != '']
for line in filtered_by_contains:
    print(line)

print("\n--- 'エラーコード' in line の結果 ---")
# 特定のキーワードが含まれる行を抽出
filtered_by_keyword = [line for line in another_text_data.splitlines() if 'エラーコード' in line and line.strip() != '']
for line in filtered_by_keyword:
    print(line)
 

 

出力例
--- '*' in line の結果 ---
重要!この行には*特別な情報*が含まれています。
途中にアスタリスク*がある行です。
* これは行頭にアスタリスクがある行ですが、in演算子でも検出されます。

--- 'エラーコード' in line の結果 ---
ログファイルのエラーコード: ERR_001
 

 

‘*’ in line を使うことで、行のどの位置に*があってもその行が抽出されることがわかります。行頭に*がある場合もin演算子はTrueを返すため、startswith()よりも広範囲の抽出が可能です。

まとめ

startswith() メソッドと in 演算子は、どちらもPythonで文字列をフィルタリングする際に非常に強力なツールですが、その用途は明確に異なります。

  • startswith() : 文字列の先頭が特定のパターンと一致するかどうかをチェックしたい場合に最適。
  • in演算子 : 文字列のどこかに特定の文字や部分文字列が含まれているかどうかをチェックしたい場合に最適。

これらの違いを理解し適切な場面で使い分けることで、Pythonによるテキスト処理の効率と精度を格段に向上させることができます。

 

スポンサーリンク

 - Python