プログラマー必見!re.Pattern.findall()でテキストを効率的に検索


"re.Pattern.findall()" は、Python の "Text Processing" における重要な機能です。この関数は、テキスト内から特定のパターンに一致するすべての部分文字列を検索し、リストとして返します。

使い方

import re

# 検索対象のテキスト
text = "Python は素晴らしいプログラミング言語です。\n\
Python は汎用性が高く、様々な用途に利用できます。"

# 検索パターン
pattern = r"\bPython\b"  # \b は単語境界を表す

# 検索の実行
matches = re.findall(pattern, text)

# 結果の表示
print(matches)

このコードを実行すると、以下の出力が得られます。

['Python', 'Python']

上記の例では、r"\bPython\b" というパターンを使って、テキスト内にあるすべての "Python" という単語を検索しています。\b は単語境界を表す特殊文字であり、"Python" という単語全体のみを一致させます。

応用例

"re.Pattern.findall()" は、様々な場面で役立ちます。以下に、いくつかの例を紹介します。

  • テキストを特定の形式に整形する
  • HTML タグやスクリプトコードを削除する
  • メールアドレスや電話番号などの情報を抽出する
  • 特定の単語やフレーズの出現回数をカウントする

注意点

"re.Pattern.findall()" を使用する際には、以下の点に注意する必要があります。

  • 検索対象のテキストが十分に長いことを確認する
  • グローバルフラグ (re.G) を使用しない
  • 正規表現のパターンを正しく記述する

"re.Pattern.findall()" は、Python の "Text Processing" における強力なツールです。この関数を使いこなすことで、テキストデータを効率的に処理することができます。

  • "re.Pattern.findall()" 以外にも、テキスト検索を行うための様々な関数があります。用途に応じて適切な関数を選択してください。


特定の単語やフレーズの出現回数をカウントする

import re

text = "Python は素晴らしいプログラミング言語です。\n\
Python は汎用性が高く、様々な用途に利用できます。"

pattern = r"\bPython\b"

# 出現回数のカウント
count = len(re.findall(pattern, text))

print(f"'Python' の出現回数: {count}")

このコードは、テキスト内にある "Python" という単語の出現回数をカウントします。

メールアドレスや電話番号などの情報を抽出する

import re

text = """
この文書には、連絡先情報が含まれています。
メールアドレス: [email protected]
電話番号: 090-1234-5678
"""

pattern_email = r"\w+@\w+\.\w+"
pattern_phone = r"\d{3}-\d{3}-\d{4}"

# メールアドレスの抽出
emails = re.findall(pattern_email, text)
print("メールアドレス:", emails)

# 電話番号の抽出
phones = re.findall(pattern_phone, text)
print("電話番号:", phones)

このコードは、テキストからメールアドレスと電話番号を抽出します。

HTML タグやスクリプトコードを削除する

import re

html_text = """
<html>
<head>
<title>サンプルページ</title>
</head>
<body>
<h1>本文</h1>
<p>この文章は HTML タグで囲まれています。</p>
<script>
// JavaScript コード
</script>
</body>
</html>
"""

pattern_tag = r"<[^>]+>"
pattern_script = r"<script>[\s\S]*?</script>"

# HTML タグの削除
plain_text = re.sub(pattern_tag, "", html_text)

# スクリプトコードの削除
plain_text = re.sub(pattern_script, "", plain_text)

print(plain_text)

このコードは、HTML タグとスクリプトコードを削除して、本文のみを抽出します。

import re

text = """
名前: 佐藤 太郎
年齢: 30歳
職業: エンジニア
"""

pattern = r"(\w+): (.*)"

# 氏名、年齢、職業をそれぞれリストに格納
names = []
ages = []
occupations = []

for match in re.findall(pattern, text):
    key, value = match
    if key == "名前":
        names.append(value)
    elif key == "年齢":
        ages.append(value)
    elif key == "職業":
        occupations.append(value)

# フォーマットされた文字列を出力
formatted_text = ""
for i in range(len(names)):
    formatted_text += f"{i + 1}. 名前: {names[i]}, 年齢: {ages[i]}, 職業: {occupations[i]}\n"

print(formatted_text)


"itertools.groupby()" を使用する

この方法は、連続する一致部分文字列をグループ化して処理したい場合に有効です。

import re
import itertools

text = "Python は素晴らしいプログラミング言語です。 Python は汎用性が高く、様々な用途に利用できます。"

pattern = r"\bPython\b"

# 一致部分文字列のグループ化
groups = itertools.groupby(re.finditer(pattern, text))

# グループごとに処理
for key, matches in groups:
    print(f"グループ: {key}")
    for match in matches:
        print(f"  - {match.group()}")

このコードでは、itertools.groupby() を使って、一致部分文字列を "Python" という文字列ごとにグループ化しています。その後、各グループに対して処理を行っています。

"string.find()" と "string.count()" を使用する

この方法は、単純なパターンで一致する部分文字列を検索したい場合に有効です。

text = "Python は素晴らしいプログラミング言語です。 Python は汎用性が高く、様々な用途に利用できます。"

pattern = "Python"

# 最初の出現位置を検索
first_index = text.find(pattern)
if first_index != -1:
    print(f"最初の出現位置: {first_index}")

# 出現回数をカウント
count = text.count(pattern)
print(f"出現回数: {count}")

このコードでは、"string.find()" を使って、パターンに一致する最初の部分文字列の位置を検索しています。また、"string.count()" を使って、パターンに一致する部分文字列の出現回数をカウントしています。

"pandas" ライブラリを使用する

この方法は、テキストデータを DataFrame として処理したい場合に有効です。

import pandas as pd

text = "Python は素晴らしいプログラミング言語です。 Python は汎用性が高く、様々な用途に利用できます。"

pattern = r"\bPython\b"

# DataFrame として読み込み
df = pd.DataFrame(data=[text], columns=["text"])

# パターンに一致する部分文字列を抽出
matches = df["text"].str.findall(pattern)

# 結果の表示
print(matches.item())

このコードでは、"pandas" ライブラリを使って、テキストデータを DataFrame として読み込んでいます。その後、str.findall() メソッドを使って、パターンに一致する部分文字列を抽出しています。

カスタム関数を使用する

複雑なパターンや処理が必要な場合は、カスタム関数を作成する方が効率的な場合があります。

import re

def find_pattern(text, pattern):
    matches = []
    for match in re.finditer(pattern, text):
        matches.append(match.group())
    return matches

text = "Python は素晴らしいプログラミング言語です。 Python は汎用性が高く、様々な用途に利用できます。"

pattern = r"\bPython\b"

# カスタム関数を呼び出す
matches = find_pattern(text, pattern)

# 結果の表示
print(matches)

このコードでは、find_pattern() というカスタム関数を作成して、パターンに一致する部分文字列を検索しています。この関数は、re.finditer() を使ってパターンに一致するすべての部分文字列を抽出し、リストとして返します。

上記以外にも、"re.search()" や "re.match()" などの関数を使うこともできます。状況に合わせて適切な方法を選択してください。