コンテンツにスキップ

正規表現を使ってPythonで文字列を置換する方法を簡単に解説

[

Pythonで文字列または部分文字列を削除または置換する方法

Pythonでは、.replace()メソッドとre.sub()関数を使用して、テキストをクリーンアップするために文字列や部分文字列を削除または置換することがよくあります。このチュートリアルでは、架空のチャットルームのテキストを取り、チャットを理解しやすくするために、.replace()メソッドとre.sub()関数を使用してテキストをサニタイズするスクリプトを作成することになります。

まず、スクリプトを作成する前に、使用するテキストデータを準備する必要があります。以下のようなチャットのトランスクリプトが与えられました。

[support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
[johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T CONNECT TO MY BLASTED ACCOUNT
[support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your caps lock?
[johndoe] 2022-08-24T10:04:03+00:00 : Blast! You're right!

このトランスクリプトには、ユーザーの識別子、ISO時刻スタンプ、メッセージが含まれています。personal dataおよび大文字の単語を置き換えるために、トランスクリプトをサニタイズする必要があります。

まずは、悪態の言葉に対処しましょう。

Pythonの文字列や部分文字列を削除または置換する方法

Pythonで文字列を置換する最も基本的な方法は、.replace()メソッドを使用することです。

>>> "Fake Python".replace("Fake", "Real")

上記の例では、.replace()メソッドを任意の文字列に連結し、メソッドに2つの引数を指定します。最初の引数は置換したい文字列であり、2番目の引数は置換する文字列です。

注意:Pythonのシェルでは.replace()の結果が表示されますが、文字列自体は変更されません。これは、文字列を変数に割り当ててみることでより明確に確認できます。

>>> name = "Fake Python"
>>> name.replace("Fake", "Real")
>>> name
'Fake Python'
>>> name = name.replace("Fake", "Real")
>>> name

それでは、これらの知識をトランスクリプトに適用しましょう。

>>> transcript = """\
... [support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
... [johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T CONNECT TO MY BLASTED ACCOUNT
... [support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your caps lock?
... [johndoe] 2022-08-24T10:04:03+00:00 : Blast! You're right!"""
>>> transcript.replace("BLASTED", "😤")
[support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
[johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T CONNECT TO MY 😤 ACCOUNT
[support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your caps lock?
[johndoe] 2022-08-24T10:04:03+00:00 : 😤! You're right!

上記の例では、transcriptという変数にチャットのトランスクリプトを代入しました。その後、.replace()メソッドを使用して"BLASTED"という文字列を"😤"に置換しました。結果として、悪態の言葉が絵文字に置き換えられました。

これで、文字列の置換を行う基本的な方法がわかりました。次に、複数の置換ルールを設定する方法を見ていきましょう。

複数の置換ルールを設定する方法

場合によっては、複数の異なる置換ルールを設定する必要がある場合があります。その場合、辞書またはリストを使用して複数の置換ルールを管理することができます。

例えば、以下のような置換ルールを考えてみましょう。

replace_rules = {
"BLASTED": "😤",
"CONNECT": "🔌",
"CAPS LOCK": "⌨️",
"Blast!": "😱",
}

上記の辞書(replace_rules)では、キーと値のペアとして置換する文字列とその置換先を指定しています。

次に、トランスクリプトに対して複数の置換ルールを適用する方法を示します。

transcript = """\
[support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
[johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T CONNECT TO MY BLASTED ACCOUNT
[support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your caps lock?
[johndoe] 2022-08-24T10:04:03+00:00 : Blast! You're right!"""
for old_word, new_word in replace_rules.items():
transcript = transcript.replace(old_word, new_word)
print(transcript)

上記の例では、replace_rulesのキーと値をforループで反復処理し、transcriptに対して.replace()メソッドを適用しています。このようにすることで、トランスクリプトの複数の箇所で置換ルールが適用されます。

これにより、チャットのトランスクリプトが次のようにサニタイズされます。

[support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
[johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T 🔌 TO MY 😤 ACCOUNT
[support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your ⌨️?
[johndoe] 2022-08-24T10:04:03+00:00 : 😱 You're right!

これで、複数の置換ルールを設定する方法がわかりました。次に、re.sub()を使用して複雑なルールを作成する方法について見ていきましょう。

複雑なルールを作成するためにre.sub()を活用する

re.sub()関数を使用すると、より複雑な置換ルールを作成することができます。re.sub()関数は正規表現を使用してパターンに一致する文字列を置換することができます。

例えば、以下のような複雑な置換ルールを考えてみましょう。

import re
replace_rules = {
r"\b(BL\S+ED)\b": r"😤",
r"\b(CONNECT)\b": r"🔌",
r"\b(CAPS LOCK)\b": r"⌨️",
r"\b(Blast!)\b": r"😱",
}

上記の辞書(replace_rules)では、正規表現のパターンとそのパターンに一致した文字列を置換するための置換先を指定しています。

次に、トランスクリプトに対してre.sub()関数を使用して複雑な置換ルールを適用する方法を示します。

transcript = """\
[support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
[johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T CONNECT TO MY BLASTED ACCOUNT
[support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your caps lock?
[johndoe] 2022-08-24T10:04:03+00:00 : Blast! You're right!"""
for old_pattern, new_pattern in replace_rules.items():
transcript = re.sub(old_pattern, new_pattern, transcript)
print(transcript)

上記の例では、replace_rulesのキーと値をforループで反復処理し、re.sub()関数を使用してトランスクリプトに対して置換を行っています。この方法を使用することで、より柔軟な置換ルールを作成することができます。

これにより、チャットのトランスクリプトが次のようにサニタイズされます。

[support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
[johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T 🔌 TO MY 😤 ACCOUNT
[support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your ⌨️?
[johndoe] 2022-08-24T10:04:03+00:00 : 😱 You're right!

これで、re.sub()を使用して複雑な置換ルールを作成する方法がわかりました。次に、さらに制御を行うためにre.sub()にコールバック関数を使用する方法について見ていきましょう。

より詳細な制御のためにre.sub()にコールバック関数を使用する方法

re.sub()関数では、コールバック関数を使用してより詳細な制御を行うことができます。コールバック関数は、パターンに一致した部分文字列を取得し、その部分文字列を置換するための処理を行います。

例えば、以下のようなコールバック関数を考えてみましょう。

import re
def censor_swears(match):
swears = {
"Blast": "😱",
}
return swears.get(match.group(0), match.group(0))
replace_pattern = r"\b(Blast)\b"

上記の例では、censor_swears()というコールバック関数を定義しています。この関数は、swearsという辞書を使用して悪態の言葉を置換する処理を行います。また、replace_patternという正規表現パターンを指定しています。

次に、トランスクリプトに対してre.sub()関数を使用してコールバック関数を適用する方法を示します。

transcript = """\
[support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
[johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T CONNECT TO MY BLASTED ACCOUNT
[support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your caps lock?
[johndoe] 2022-08-24T10:04:03+00:00 : Blast! You're right!"""
transcript = re.sub(replace_pattern, censor_swears, transcript)
print(transcript)

上記の例では、re.sub()関数を使用してトランスクリプトに対してコールバック関数を適用しています。これにより、"Blast"という単語が"😱"に置換されます。

これにより、チャットのトランスクリプトが次のようにサニタイズされます。

[support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
[johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T CONNECT TO MY 😱ED ACCOUNT
[support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your caps lock?
[johndoe] 2022-08-24T10:04:03+00:00 : 😱! You're right!

これで、より詳細な制御のためにre.sub()にコールバック関数を使用する方法がわかりました。最後に、スクリプトにコールバック関数を適用しましょう。

スクリプトにコールバック関数を適用する

これまでのチュートリアルで学んだ知識を使って、チャットのトランスクリプトに対して複数の置換ルールとコールバック関数を適用するスクリプトを作成しましょう。

import re
def censor_swears(match):
swears = {
"Blast": "😱",
}
return swears.get(match.group(0), match.group(0))
replace_rules = {
r"\b(BL\S+ED)\b": r"😤",
r"\b(CONNECT)\b": r"🔌",
r"\b(CAPS LOCK)\b": r"⌨️",
}
transcript = """\
[support_tom] 2022-08-24T10:02:23+00:00 : What can I help you with?
[johndoe] 2022-08-24T10:03:15+00:00 : I CAN'T CONNECT TO MY BLASTED ACCOUNT
[support_tom] 2022-08-24T10:03:30+00:00 : Are you sure it's not your caps lock?
[johndoe] 2022-08-24T10:04:03+00:00 : Blast! You're right!"""
# Apply the replace rules
for old_pattern, new_pattern in replace_rules.items():
transcript = re.sub(old_pattern, new_pattern, transcript)
# Apply the callback function
replace_pattern = r"\b(Blast)\b"
transcript = re.sub(replace_pattern, censor_swears, transcript)
print(transcript)

上記のスクリプトでは、re.sub()関数を使用して複数の置換ルールとコールバック関数を順番に適用しています。これにより、チャットのトランスクリプトがサニタイズされます。

まとめ

  • replace()メソッドは、文字列や部分文字列を置換するために使用されます。
  • 複数の置換ルールを設定する場合は、辞書またはリストを使用して管理することができます。
  • re.sub()関数を使用すると、より複雑な置換ルールを作成できます。正規表現によるパターン一致を行い、置換を行うことができます。
  • re.sub()関数にコールバック関数を使用すると、より詳細な制御を行うことができます。パターンに一致した部分文字列を取得し、その部分文字列を置換するための処理を行います。

以上がPythonで文字列や部分文字列を削除または置換する方法についてのチュートリアルです。これらの方法を活用して、テキストデータを簡単にクリーンアップすることができます。