PythonのPandasにおける正規表現(regex)を使ったデータ抽出は、テキストデータを操作する際に非常に強力な手法です。
特に、データフレーム(DataFrame
)やシリーズ(Series
)内の文字列に対して、パターンに基づくフィルタリングや変換を行うことができます。
目次
正規表現を使う場面と基本構文
よくあるユースケース
- 特定のパターンにマッチする行を抽出
- 電話番号、メールアドレス、URLなどの検出
- 数字やアルファベットの抽出
- 前方一致/後方一致/部分一致のフィルタ
- 特定文字の有無による分類やフラグ付け
正規表現の基本
パターン | 説明 |
---|---|
. | 任意の1文字 |
^ | 文字列の先頭 |
$ | 文字列の末尾 |
* | 0回以上の繰り返し |
+ | 1回以上の繰り返し |
? | 0回または1回の出現 |
[abc] | a, b, c のいずれか |
[^abc] | a, b, c 以外 |
\d | 数字(0-9) |
\w | 単語文字(英数字+アンダースコア) |
\s | 空白文字(空白、改行、タブなど) |
str.contains()
で条件抽出
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'email': ['alice@example.com', 'bob@work.net', 'charlie@edu.org', 'david@example.com', 'eve@private.com']
})
# "example"を含むメールアドレスを抽出
filtered_df = df[df['email'].str.contains(r'example', regex=True)]
print(filtered_df)
オプション
case=False
:大文字小文字を無視na=False
:NaNを無視してFalse扱い
str.extract()
でパターンから抽出
df['domain'] = df['email'].str.extract(r'@(.+)$')
print(df[['email', 'domain']])
- 括弧
()
はキャプチャグループを意味し、抽出対象を指定します。 - 複数の括弧がある場合は複数列で返ります。
str.replace()
で文字列の置換
# ドメインがexample.comのメールだけをマスキング
df['email_masked'] = df['email'].str.replace(r'^.*@example\.com$', 'masked@example.com', regex=True)
print(df[['email', 'email_masked']])
- 正規表現ベースでの文字列置換が可能。
regex=False
にすれば単純な文字列置換。
str.match()
との違い
match()
は先頭がマッチしていないとFalse
contains()
は文字列内にどこかマッチすればTrue
# "Alice" で始まる name を判定(先頭一致)
df['is_alice'] = df['name'].str.match(r'^Alice')
print(df[['name', 'is_alice']])
応用例:電話番号の抽出と整形
# 電話番号のサンプル
data = pd.DataFrame({
'contact': ['080-1234-5678', '03-9999-9999', 'abc', '05012345678', None]
})
# 「数字-数字-数字」の形式を抽出
data['phone_extracted'] = data['contact'].str.extract(r'(\d{2,4}-\d{2,4}-\d{4})')
# ハイフンなし電話番号(10桁または11桁の数字)を抽出
data['digits_only'] = data['contact'].str.extract(r'(\d{10,11})')
print(data)
応用例:メールアドレスのドメイン分類
# ドメイン部分(example, work など)を抽出
df['domain_type'] = df['email'].str.extract(r'@(\w+)\.')
print(df[['email', 'domain_type']])
正規表現を使ったフィルタ条件の組み合わせ(AND/OR)
# example.comで終わるかを判定
df['is_example_com'] = df['email'].str.contains(r'@example\.com$', regex=True)
print(df[['email', 'is_example_com']])
# "example" または "work" を含むメール
df['is_example_or_work'] = df['email'].str.contains(r'example|work', regex=True)
print(df[['email', 'is_example_or_work']])
pandasで正規表現を使う関数まとめ
関数名 | 用途 |
---|---|
str.contains() | 正規表現によるフィルタリング |
str.extract() | パターンの部分抽出 |
str.match() | 先頭とのマッチ確認 |
str.replace() | 正規表現を使った置換 |
str.findall() | 全てのマッチをリストで取得 |
まとめ:Pandasでの正規表現活用のポイント
- 正規表現は、複雑なテキストパターンを自在に扱える
str.contains()
とstr.extract()
を中心に使うと便利na=False
を指定してNaN対策を忘れずに- 処理前に
.astype(str)
で型を文字列にしておくと安全 - pandasと正規表現の組み合わせは、前処理、データクレンジング、特徴量生成に不可欠
以上、PythonのPandasの正規表現を使ったデータ抽出についてでした。
最後までお読みいただき、ありがとうございました。