Pythonテキスト処理の達人になるための道:正規表現オブジェクト(re) のすべて

2024-04-02

Pythonのテキスト処理における正規表現オブジェクト(re)

正規表現オブジェクトとは

reモジュールで正規表現を使用するには、まず正規表現パターンをコンパイルして正規表現オブジェクトを作成する必要があります。正規表現オブジェクトは、パターンにマッチする文字列を検索したり、置換したり、その他の操作を行うためのメソッドを提供します。

正規表現パターンは、文字列リテラルとして記述することができます。パターンには、特殊な意味を持つメタ文字や、文字クラスを表す記号などを使用することができます。

例:

# 数字のみ抽出するパターン
pattern = r"\d+"

# 英数字とハイフンのみ抽出するパターン
pattern = r"[a-zA-Z0-9-]+"

# メールアドレスのパターン
pattern = r"[^@]+@[^@]+\.[^@]+"

正規表現オブジェクトの使用方法

正規表現オブジェクトを作成したら、以下のメソッドを使用してさまざまな操作を行うことができます。

match()メソッドは、文字列の先頭がパターンに一致するかどうかを調べます。一致する場合は、マッチオブジェクトが返されます。

例:

text = "Pythonチュートリアル"

# 先頭が"Python"と一致するかどうかを調べる
match = re.match(r"Python", text)

if match:
  print("先頭が'Python'と一致しています")
else:
  print("先頭が'Python'と一致していません")

search()メソッドは、文字列全体を検索し、パターンに一致する最初の部分を見つけます。一致する場合は、マッチオブジェクトが返されます。

例:

text = "Pythonチュートリアルは、Pythonを学ぶための入門書です。"

# 最初に"Python"が出現する位置を見つける
match = re.search(r"Python", text)

if match:
  print("最初に出現する'Python'の位置:", match.start())
else:
  print("パターンに一致する部分が見つかりません")

findall()メソッドは、文字列全体を検索し、パターンに一致するすべての部分を見つけます。一致する部分のリストが返されます。

例:

text = "Pythonチュートリアルは、Pythonを学ぶための入門書です。"

# すべての"Python"が出現する位置を見つける
matches = re.findall(r"Python", text)

for match in matches:
  print("出現位置:", match.start())

sub()メソッドは、パターンに一致する部分文字列を置換します。

例:

text = "Pythonチュートリアルは、Pythonを学ぶための入門書です。"

# すべての"Python"を"PyCon"に置換する
new_text = re.sub(r"Python", "PyCon", text)

print(new_text)

正規表現オブジェクトは、Pythonのテキスト処理において非常に強力なツールです。さまざまなパターンを記述することで、複雑なテキスト処理タスクを効率的に実行することができます。



正規表現オブジェクト(re) サンプルコード

import re

text = "商品価格は12,345円です。"

# 数字のみ抽出
numbers = re.findall(r"\d+", text)

# 結果を出力
for number in numbers:
  print(number)

英数字とハイフンのみ抽出

import re

text = "ユーザーID: abc-12345"

# 英数字とハイフンのみ抽出
id = re.findall(r"[a-zA-Z0-9-]+", text)

# 結果を出力
print(id[0])

メールアドレスの抽出

import re

text = "お問い合わせ: [email protected]"

# メールアドレス抽出
email = re.findall(r"[^@]+@[^@]+\.[^@]+", text)

# 結果を出力
print(email[0])

文字列の置換

import re

text = "Pythonチュートリアルは、Pythonを学ぶための入門書です。"

# "Python"を"PyCon"に置換
new_text = re.sub(r"Python", "PyCon", text)

# 結果を出力
print(new_text)

電話番号の検証

import re

text = "電話番号: 03-1234-5678"

# 電話番号の検証
is_valid = re.match(r"^0\d{2}-\d{4}-\d{4}$", text)

if is_valid:
  print("有効な電話番号です")
else:
  print("無効な電話番号です")

URLの抽出

import re

text = "ホームページ: https://www.example.com/"

# URL抽出
url = re.findall(r"https?://[^\s]+", text)

# 結果を出力
print(url[0])

HTMLタグの除去

import re

text = "<h1>タイトル</h1><p>本文</p>"

# HTMLタグ除去
text = re.sub(r"<.+?>", "", text)

# 結果を出力
print(text)

行頭スペースの削除

import re

text = """
  行頭スペース1
  行頭スペース2
"""

# 行頭スペース削除
text = re.sub(r"^ ", "", text, flags=re.M)

# 結果を出力
print(text)

空白行の削除

import re

text = """
空行1

空行2

"""

# 空白行削除
text = re.sub(r"^\s+$", "", text, flags=re.M)

# 結果を出力
print(text)

重複する文字列の削除

import re

text = "abcabcabc"

# 重複する文字列削除
text = re.sub(r"(.).*\1", r"\1", text)

# 結果を出力
print(text)

これらのサンプルコードは、reモジュールのさまざまな機能を理解するために役立ちます。

補足

  • 上記のサンプルコードは、基本的な使い方を示すために簡略化されています。
  • より複雑な処理を行う場合は、reモジュールの詳細なドキュメントを参照してください。


正規表現オブジェクト(re) 以外の方法

文字列操作関数

Python標準ライブラリのstrモジュールには、文字列を検索、置換、分割などを行うさまざまな関数が提供されています。

例:

text = "Pythonチュートリアル"

# 先頭が"Python"かどうかを調べる
if text.startswith("Python"):
  print("先頭が'Python'と一致しています")

# 最初に"Python"が出現する位置を見つける
index = text.find("Python")

# "Python"を"PyCon"に置換する
new_text = text.replace("Python", "PyCon")

split()、join() メソッド

split()メソッドは、文字列を指定された文字で分割し、リストを返します。join()メソッドは、リストを指定された文字で結合して、文字列を返します。

例:

text = "Python,チュートリアル,入門書"

# カンマで分割
words = text.split(",")

# 空白で結合
new_text = " ".join(words)

テンプレートエンジン

Jinja2などのテンプレートエンジンを使用すると、変数や式を埋め込んだ動的なテキストを生成することができます。

例:

from jinja2 import Template

template = Template("こんにちは、{{ name }}さん。")

# 変数をテンプレートに埋め込む
rendered_text = template.render(name="John")

# 結果を出力
print(rendered_text)

ライブラリ

テキスト処理に特化したライブラリも多数存在します。

  • Beautiful Soup:HTML/XMLの解析
  • lxml:XMLの解析
  • NLTK:自然言語処理
  • spaCy:自然言語処理

これらのライブラリを使用すると、より複雑なテキスト処理を効率的に行うことができます。

正規表現オブジェクト(re) は、テキスト処理を行うための強力なツールですが、他にもさまざまな方法があります。処理内容や目的に合わせて、適切な方法を選択することが重要です。