ウェブサイト検索

データ クリーニングで正規表現を使用するための 5 つのヒント


Python で正規表現を使用してデータ クリーニングを行う方法を学びます。

Linux または Mac ユーザーであれば、コマンド ラインで grep を使用して、パターンに一致するファイルを検索したことがあるでしょう。正規表現 (regex) を使用すると、パターンに基づいてテキストを検索、照合、操作できます。そのため、テキスト処理とデータ クリーニングのための強力なツールになります。

Python での正規表現一致操作には、組み込みの re モジュールを使用できます。このチュートリアルでは、正規表現を使用してデータをクリーンアップする方法を見ていきます。  不要な文字の削除、特定のパターンの抽出、テキストの検索と置換などについて見ていきます。

1. 不要な文字を削除する

先に進む前に、組み込みの re モジュールをインポートしましょう。

import re

文字列フィールドを分析するには、(ほぼ)常に大規模なクリーニングが必要です。不要な文字は、さまざまな形式に起因して発生することが多く、データの分析が困難になる可能性があります。正規表現を使用すると、これらを効率的に削除できます。

re モジュールの sub() 関数を使用すると、出現するパターンまたは特殊文字をすべて置換または削除できます。ダッシュと括弧を含む電話番号の文字列があるとします。次のように削除できます。

text = "Contact info: (123)-456-7890 and 987-654-3210."
cleaned_text = re.sub(r'[()-]', '', text)
print(cleaned_text) 

ここで、re.sub(pattern, replace, string) は、文字列内のパターンのすべての出現を置換で置き換えます。 r'[()-]' パターンを使用して、(、)、または - の出現に一致し、次の出力が得られます。

Output >>> Contact info: 1234567890 or 9876543210

2. 特定のパターンを抽出する

電子メール アドレス、URL、または電話番号は関連情報であるため、テキスト フィールドから抽出するのは一般的なタスクです。また、関心のある特定のパターンをすべて抽出するには、findall() 関数を使用できます。

次のようにテキストから電子メール アドレスを抽出できます。

text = "Please reach out to us at support@example.org or help@example.org."
emails = re.findall(r'\b[\w.-]+?@\w+?\.\w+?\b', text)
print(emails)

re.findall(pattern, string) 関数は、文字列内のパターンのすべての出現を検索して (リストとして) 返します。すべての電子メール アドレスと一致するために、パターン r'\b[\w.-]+?@\w+?\.\w+?\b' を使用します。

Output >>> ['support@example.com', 'help@example.org']

3. パターンを置き換える

不要な特殊文字を削除するために、すでに sub() 関数を使用しました。ただし、パターンを別のパターンに置き換えて、フィールドをより一貫性のある分析に適したものにすることができます。

不要なスペースを削除する例を次に示します。

text = "Using     regular     expressions."
cleaned_text = re.sub(r'\s+', ' ', text)
print(cleaned_text) 

r'\s+' パターンは 1 つ以上の空白文字と一致します。置換文字列は単一のスペースであり、次の出力が得られます。

Output >>> Using regular expressions.

4. データ形式の検証

データ形式を検証することで、データの一貫性と正確性が保証されます。 Regex は、電子メール、電話番号、日付などの形式を検証できます。

match() 関数を使用して電子メール アドレスを検証する方法は次のとおりです。

email = "test@example.com"
if re.match(r'^\b[\w.-]+?@\w+?\.\w+?\b$', email):
    print("Valid email")  
else:
    print("Invalid email")

この例では、電子メール文字列は有効です。

Output >>> Valid email

5. パターンごとに文字列を分割する

パターンや特定の区切り記号の出現に基づいて、文字列を複数の文字列に分割したい場合があります。これを行うには、split() 関数を使用できます。

text 文字列を文に分割しましょう。

text = "This is sentence one. And this is sentence two! Is this sentence three?"
sentences = re.split(r'[.!?]', text)
print(sentences) 

ここで、re.split(pattern, string) は、パターンが出現するすべての箇所で文字列を分割します。 r'[.!?]' パターンを使用して、ピリオド、感嘆符、または疑問符を照合します。

Output >>> ['This is sentence one', ' And this is sentence two', ' Is this sentence three', '']

正規表現を使用して Pandas データ フレームをクリーンアップする

正規表現とパンダを組み合わせると、データ フレームを効率的にクリーンアップできます。

名前からアルファベット以外の文字を削除し、データ フレーム内の電子メール アドレスを検証するには:

import pandas as pd

data = {
	'names': ['Alice123', 'Bob!@#', 'Charlie$$$'],
	'emails': ['alice@example.com', 'bob_at_example.com', 'charlie@example.com']
}
df = pd.DataFrame(data)

# Remove non-alphabetic characters from names
df['names'] = df['names'].str.replace(r'[^a-zA-Z]', '', regex=True)

# Validate email addresses
df['valid_email'] = df['emails'].apply(lambda x: bool(re.match(r'^\b[\w.-]+?@\w+?\.\w+?\b$', x)))

print(df)

上記のコード スニペットでは次のようになります。

  • df['names'].str.replace(pattern, replace, regex=True) は、一連のパターンの出現箇所を置き換えます。
  • lambda x: bool(re.match(pattern, x)): このラムダ関数は正規表現の一致を適用し、結果をブール値に変換します。

出力は次のようになります。

 	  names           	   emails    valid_email
0	  Alice	        alice@example.com     	    True
1  	  Bob          bob_at_example.com    	    False
2         Charlie     charlie@example.com     	    True

まとめ

このチュートリアルがお役に立てば幸いです。学んだことを復習しましょう:

  • re.sub を使用して、電話番号などのダッシュや括弧などの不要な文字を削除します。
  • re.findall を使用して、テキストから特定のパターンを抽出します。
  • re.sub を使用して、複数のスペースを 1 つのスペースに変換するなど、パターンを置き換えます。
  • 電子メール アドレスの検証など、データが特定の形式に準拠していることを確認するには、re.match を使用してデータ形式を検証します。
  • パターンに基づいて文字列を分割するには、re.split を適用します。

実際には、正規表現とパンダを組み合わせて、データ フレーム内のテキスト フィールドを効率的にクリーニングします。正規表現にコメントを付けてその目的を説明し、可読性と保守性を向上させることも良い習慣です。パンダを使用したデータ クリーニングの詳細については、「Python とパンダでデータ クリーニングをマスターする 7 つのステップ」を参照してください。

関連記事