データ クリーニングで正規表現を使用するための 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 つのステップ」を参照してください。