Pythonと正規表現を活用!初心者でもできる10の置換方法

Pythonと正規表現を使ったテキスト置換方法を初心者向けに詳解する記事のサムネイルPython
この記事は約17分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Pythonと正規表現を使ったテキストの置換方法について詳しく学ぶ旅に一緒に出掛けましょう。

この記事を読んでいただくことで、Pythonと正規表現の基礎から、10の具体的なサンプルコードを通じてテキストの置換方法を身につけることができます。

プログラミング初心者の方でも理解できるように、詳しく解説していきます。

●Pythonとは

Pythonは、初学者でも扱いやすく、かつ大規模なシステム開発にも対応できる、非常に柔軟性の高いプログラミング言語です。

その豊富なライブラリと直感的な文法により、多くの開発者に利用されています。

●正規表現とは

正規表現は、文字列の検索や置換を行う際に利用されるパターンマッチングの手法です。

特定のパターンを持つ文字列を探したり、一部を別の文字列に置き換えたりすることができます。

この力強いツールをうまく使うことで、テキスト処理を効率的に行うことが可能になります。

●Pythonでの正規表現の基本

Pythonで正規表現を扱うには、組み込みのreモジュールを使います。

reモジュールには、正規表現をコンパイルするための関数や、マッチングを実行するための関数など、正規表現に関連する機能が詰まっています。

○正規表現の基本的なパターン

正規表現では、特定の文字を表すための記号(メタキャラクター)が用意されています。

例えば、”.”は任意の一文字を、”*”は前の文字が0回以上続くことを意味します。

これらを組み合わせてパターンを作り、文字列の検索や置換を行います。

○Pythonでの正規表現の利用方法

Pythonで正規表現を利用する基本的な流れは、まずreモジュールをインポートし、正規表現のパターンをre.compile()関数でコンパイルします。

次に、生成された正規表現オブジェクトを使って、文字列に対して検索や置換の操作を行います。

●Pythonでのテキスト置換の基本

Pythonでテキストの置換を行う基本的な方法は、文字列オブジェクトのreplaceメソッドと、reモジュールのsubメソッドを使用することです。

○replaceメソッドによる置換

Pythonの文字列オブジェクトには、replaceメソッドが用意されています。

このメソッドを使うと、文字列中の特定の部分を別の文字列に置き換えることができます。

引数には、置換対象の文字列と置換後の文字列を指定します。

下記のコードでは、”Hello, World!”という文字列の”World”を”Python”に置換しています。

text = "Hello, World!"
new_text = text.replace("World", "Python")
print(new_text)

実行すると、”Hello, Python!”と出力されます。

これは、”World”という文字列が”Python”に置き換えられた結果です。

○正規表現を使った置換

Pythonでは、正規表現を用いて複雑なパターンの文字列を置換することが可能です。

reモジュールのsubメソッドを使用します。

第一引数に置換対象のパターン(正規表現)、第二引数に置換後の文字列、第三引数に対象の文字列を指定します。

下記のコードでは、文字列から数字を探し出し、それを”Number”という文字列に置き換えています。

import re

text = "I have 2 apples and 3 oranges."
pattern = re.compile(r'\d+')
new_text = pattern.sub("Number", text)
print(new_text)

このコードを実行すると、”I have Number apples and Number oranges.”と出力されます。

これは、数字が”Number”に置き換えられた結果です。

●Pythonと正規表現を使った置換の10のサンプルコード

それでは、Pythonと正規表現を活用した10種類のテキスト置換の具体的な方法を、サンプルコードと共に見ていきましょう。

○サンプルコード1:単純な文字列の置換

まずは最も基本的な、単純な文字列の置換から始めてみましょう。

このコードでは、Pythonの文字列メソッドの一つであるreplaceを使って、特定の文字列を別の文字列に置換します。

この例では、元の文字列(オリジナルテキスト)の中で ‘python’ という文字列を ‘Python’ に置き換えています。

# オリジナルテキスト
text = "私はpythonが好きです。pythonは楽しいです。"

# 置換
replaced_text = text.replace('python', 'Python')

print(replaced_text)

このコードを実行すると、’私はPythonが好きです。Pythonは楽しいです。’という文字列が出力されます。

つまり、元の文字列の中で ‘python’ という部分がすべて ‘Python’ に置き換えられています。

○サンプルコード2:正規表現を使った置換

次に、Pythonのre(正規表現)モジュールを使って文字列を置換する方法を見てみましょう。

このコードでは、re.subメソッドを使って、文字列の中の数字を全て ‘X’ に置換しています。

import re

# オリジナルテキスト
text = "私の電話番号は080-1234-5678です。"

# 置換
replaced_text = re.sub(r'\d', 'X', text)

print(replaced_text)

このコードを実行すると、’私の電話番号はXXX-XXXX-XXXXです。’という文字列が出力されます。

つまり、元の文字列の中で数字(’\d’は正規表現で数字を表す)がすべて ‘X’ に置き換えられています。

○サンプルコード3:大文字・小文字を区別せずに置換

次は、大文字と小文字を区別せずに文字列を置換する方法を見てみましょう。

このコードでは、reモジュールのsubメソッドと正規表現のフラグ(re.IGNORECASE)を使用しています。

re.IGNORECASEフラグを使用すると、大文字と小文字を区別せずにマッチングが行われます。

この例では、元の文字列(オリジナルテキスト)の中で ‘Python’、’python’、’PYTHON’ など、大文字と小文字の区別なく ‘python’ を ‘Python’ に置換しています。

import re

# オリジナルテキスト
text = "私はpythonが好きです。Pythonも好きです。PYTHONも好きです。"

# 置換
replaced_text = re.sub(r'python', 'Python', text, flags=re.IGNORECASE)

print(replaced_text)

このコードを実行すると、’私はPythonが好きです。Pythonも好きです。Pythonも好きです。’という文字列が出力されます。

つまり、元の文字列の中で ‘python’、’Python’、’PYTHON’ など、大文字と小文字を問わずに全て ‘Python’ に置き換えられています。

○サンプルコード4:全角・半角の統一

日本語のテキスト処理においてよく遭遇する問題が、全角と半角の文字の混在です。

次のコードでは、Pythonのunicodedataモジュールを用いて全角の文字を半角に置換します。

この例では、元の文字列(オリジナルテキスト)の中で全角の英数字を半角に置換しています。

import unicodedata

# オリジナルテキスト
text = "Pythonは楽しいです。"

# 置換
replaced_text = unicodedata.normalize('NFKC', text)

print(replaced_text)

このコードを実行すると、’Pythonは楽しいです。’という文字列が出力されます。

つまり、元の文字列の中で全角の英数字がすべて半角に置き換えられています。

unicodedata.normalizeの第一引数には’NFKC’を指定することで全角の英数字や記号を半角に、またカタカナを全角に変換することができます。

○サンプルコード5:日付フォーマットの統一

日付のフォーマットはデータによって様々で、それらを一定の形式に統一することは、日付データの取り扱いを容易にします。

Pythonのdatetimeモジュールと正規表現を用いることで、日付フォーマットの統一が可能です。

下記のコードでは、様々な日付フォーマットを ‘YYYY-MM-DD’ 形式に統一しています。

import re
from datetime import datetime

# オリジナルテキスト
text = "今日の日付は2023年7月8日です。明日は2023/07/09、昨日は2023.7.7でした。"

# 置換
def replace_date(match):
    date_str = match.group().replace('年', '/').replace('月', '/').replace('日', '')
    date = datetime.strptime(date_str, '%Y/%m/%d')
    return date.strftime('%Y-%m-%d')

replaced_text = re.sub(r'\d{4}[年|/|\.]\d{1,2}[月|/|\.]\d{1,2}日?', replace_date, text)

print(replaced_text)

このコードを実行すると、’今日の日付は2023-07-08です。明日は2023-07-09、昨日は2023-07-07でした。’という文字列が出力されます。

つまり、元の文字列の中で ‘2023年7月8日’、’2023/07/09’、’2023.7.7’ など、様々な日付フォーマットがすべて ‘YYYY-MM-DD’ 形式に置き換えられています。

○サンプルコード6:メールアドレスの置換

個人情報の保護やプライバシーの観点から、メールアドレスを一定の形式に置換することはよくあります。

下記のコードでは、メールアドレスを ‘@.com’ 形式に置換します。

この例では、正規表現を用いてメールアドレスを検出し、それを指定した形式に置換しています。

import re

# オリジナルテキスト
text = "私のメールアドレスはexample@example.comです。"

# 置換
replaced_text = re.sub(r'[a-zA-Z0-9_\.-]+@[a-zA-Z0-9_\.-]+\.[a-zA-Z0-9_\.-]+', '****@****.com', text)

print(replaced_text)

このコードを実行すると、’私のメールアドレスは@.comです。’という文字列が出力されます。

つまり、元の文字列の中で ‘example@example.com’ が ‘@.com’ に置き換えられています。

このように、Pythonと正規表現を用いれば、様々な形式のテキストを容易に置換することが可能です。

○サンプルコード7:HTMLタグの削除

ウェブスクレイピングを行う際や、HTMLのテキストデータを取り扱う際には、HTMLタグを削除することが必要になります。

下記のコードでは、HTMLタグを含むテキストから全てのHTMLタグを削除しています。

この場合、正規表現を用いて、HTMLタグを特定し、それを削除しています。

import re

# オリジナルテキスト
text = "<html><body>こんにちは。<br>Pythonと正規表現は強力な組み合わせです。</body></html>"

# HTMLタグを削除
replaced_text = re.sub(r'<[^>]*?>', '', text)

print(replaced_text)

このコードを実行すると、’こんにちは。Pythonと正規表現は強力な組み合わせです。’という文字列が出力されます。

つまり、元の文字列の中のHTMLタグがすべて削除され、タグなしのテキストのみが出力されています。

○サンプルコード8:特定のパターンを持つ行の削除

テキストデータから特定のパターンを持つ行を全て削除したい場合も、Pythonと正規表現を使用します。

下記のコードでは、’#’で始まる行(コメント行)を削除しています。

この場合も、正規表現を用いて特定のパターンを持つ行を検出し、それを削除しています。

import re

# オリジナルテキスト
text = """
# これはコメント行です
print('Hello, World!')
# これもコメント行です
print('Python is fun!')
"""

# '#'で始まる行を削除
replaced_text = re.sub(r'^#.*$', '', text, flags=re.MULTILINE)

print(replaced_text)

このコードを実行すると、次の文字列が出力されます。

print('Hello, World!')
print('Python is fun!')

つまり、元の文字列の中の’#’で始まる行がすべて削除され、コメントなしのコードのみが出力されています。

○サンプルコード9:URLの置換

文章中のURLを別のURLに置換したい場合も、Pythonと正規表現を利用します。

下記のコードは、特定のURLパターンを持つ文字列を検出し、それを新しいURLに置換することを表しています。

import re

# オリジナルテキスト
text = "JPSMのウェブサイトはhttps://jp-seemore.comです。"

# URLを置換
replaced_text = re.sub(r'https?://[^\s]*', 'https://www.newurl.com', text)

print(replaced_text)

このコードを実行すると、「JPSMのウェブサイトはhttps://www.newurl.comです。」という文字列が出力されます。

元のテキストの中に含まれるURLが新しいURLに置き換えられています。

○サンプルコード10:顧客情報のマスキング

個人情報を扱う際には、プライバシー保護のために情報をマスキングすることが求められることがあります。

Pythonと正規表現を使えば、特定のパターン(この場合、メールアドレス)を検出し、それをマスキングすることも可能です。

下記のコードでは、メールアドレスを検出し、それを「[マスク済み]」というテキストに置換しています。

import re

# オリジナルテキスト
text = "お問い合わせはinfo@example.comまでお願いします。"

# メールアドレスをマスキング
replaced_text = re.sub(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+', '[マスク済み]', text)

print(replaced_text)

このコードを実行すると、「お問い合わせは[マスク済み]までお願いします。」という文字列が出力されます。

元のテキスト中のメールアドレスが、「[マスク済み]」に置き換えられています。これにより、個人情報が適切に保護されています。

●Pythonでの正規表現の注意点と対処法

Pythonで正規表現を使う際にはいくつかの注意点があります。

まず、特殊文字(メタキャラクタ)は、その前にバックスラッシュ(\)を置くことでエスケープする必要があります。

例えば、”.”は任意の文字と一致しますが、”.”そのものを検索したい場合は、”\.”とする必要があります。

下記のコードは、”.”を含む文字列を検索し、”-“に置換する例です。

import re

# オリジナルテキスト
text = "今日の天気は晴れ。最高気温は27.5度。"

# "."を"-"に置換
replaced_text = re.sub(r'\.', '-', text)

print(replaced_text)

このコードを実行すると、「今日の天気は晴れ-最高気温は27-5度-」という文字列が出力されます。

元のテキスト中の”.”が”-“に置き換えられています。

また、Pythonの正規表現では大文字小文字を区別します。

大文字と小文字を区別しない検索を行いたい場合は、re.IGNORECASEやre.Iフラグを使用します。

下記のコードは、大文字と小文字を区別せずに”python”を検索し、”PYTHON”に置換する例です。

import re

# オリジナルテキスト
text = "Python is fun. python is cool."

# "python"を大文字と小文字を区別せずに"PYTHON"に置換
replaced_text = re.sub(r'python', 'PYTHON', text, flags=re.I)

print(replaced_text)

このコードを実行すると、「PYTHON is fun. PYTHON is cool.」という文字列が出力されます。

元のテキスト中の”Python”と”python”がともに”PYTHON”に置き換えられています。

●Pythonでの正規表現のカスタマイズ方法

Pythonの正規表現は、テキストの置換においてもカスタマイズ可能です。

たとえば、特定のパターンに一致するテキストを検索し、それを基に複雑な置換を行いたい場合、置換関数を使うことができます。

下記のコードは、”dog”という文字列を検索し、それが何回目の出現であるかによって異なる文字列(”1st dog”、”2nd dog”、”3rd dog”)に置換する例です。

import re

# オリジナルテキスト
text = "dog, dog, dog."

# 出現回数
count = 1

# 置換関数
def replace(match):
    global count
    result = f"{count}番目のdog"
    count += 1
    return result

# "dog"を出現回数に基づいて置換
replaced_text = re.sub(r'dog', replace, text)

print(replaced_text)

このコードを実行すると、「1番目のdog, 2番目のdog, 3番目のdog.」という文字列が出力されます。

元のテキスト中の”dog”が出現回数に基づいて置き換えられています。

また、正規表現を使って置換する際には、グループ化を利用することもできます。

下記のコードは、”abc”という文字列を”cba”に、”def”を”fed”に置換する例です。「このとき、正規表現内でカッコ(())を使用して文字列をグループ化し、置換時にそのグループを参照します。

import re

# オリジナルテキスト
text = "abc, def."

# "abc"を"cba"に、"def"を"fed"に置換
replaced_text = re.sub(r'(abc)|(def)', lambda m: 'cba' if m.group(1) else 'fed', text)

print(replaced_text)

このコードを実行すると、「cba, fed.」という文字列が出力されます。

元のテキスト中の”abc”と”def”がそれぞれ”cba”と”fed”に置き換えられています。

これらのテクニックを利用すれば、Pythonの正規表現を使ったテキスト置換は、さらに強力で柔軟なものとなります。

これまで解説してきた注意点やカスタマイズ方法を活用して、Pythonでのテキスト処理を効率的に行いましょう。

まとめ

今回の記事では、Pythonと正規表現を使ったテキストの置換方法について詳しく解説しました。

まず、Pythonのreモジュールのsub関数を使って基本的なテキスト置換を行う方法を紹介しました。

このコードでは、正規表現のパターンにマッチしたテキストを別のテキストに置換するという基本的な処理を行っています。

次に、より複雑な置換を行うための置換関数の使い方を解説しました。

置換関数を使うと、特定のパターンにマッチしたテキストを検索し、それを基に複雑な置換を行うことができます。

この機能を使えば、出現回数に応じて異なる置換を行うなど、様々なカスタマイズが可能です。

最後に、正規表現を使った置換の際に、グループ化を利用する方法を説明しました。

グループ化を使うと、一致した部分文字列を個別に参照したり、置換テキスト中で再利用したりすることができます。

これらの方法を活用すれば、Pythonと正規表現を使って、あらゆるテキストの置換を行うことができるようになります。

この記事で学んだ知識を活かして、実際のプログラムでのテキスト処理に役立ててください。

ここまで読んでくださった方々、ありがとうございました。

これからもPythonと正規表現を活用したプログラミング学習に励んでください。