[Python] 正規表現でパターンに合う文字列を置換する方法

Pythonで正規表現を使用してパターンに合う文字列を置換するには、reモジュールのsub()関数を使用します。

sub()は、指定したパターンに一致する部分を新しい文字列に置き換えます。

基本的な構文はre.sub(pattern, replacement, string)です。

patternには正規表現、replacementには置換後の文字列、stringには対象の文字列を指定します。

オプションでフラグや置換回数を指定することも可能です。

この記事でわかること
  • re.sub()関数の基本的な使い方
  • 正規表現を用いた置換の具体例
  • キャプチャグループを活用した置換
  • 関数を使った動的な置換方法
  • さまざまな文字列操作の応用例

目次から探す

re.sub()関数の基本

Pythonのreモジュールには、正規表現を使って文字列を操作するための関数がいくつか用意されています。

その中でもre.sub()関数は、特定のパターンに一致する部分を置換するために使用されます。

以下では、re.sub()関数の基本的な使い方について解説します。

re.sub()の構文と引数

re.sub()関数の基本的な構文は以下の通りです。

import re
result = re.sub(pattern, replacement, string, count=0, flags=0)
  • pattern: 置換対象の正規表現パターン
  • replacement: 置換後の文字列
  • string: 置換対象の元の文字列
  • count: 置換する回数(デフォルトは0で、すべての一致を置換)
  • flags: 正規表現のフラグ(オプション)

置換対象のパターン指定

置換対象のパターンは、正規表現を用いて指定します。

例えば、数字を対象にする場合は、\dを使用します。

以下の例では、文字列中のすべての数字を対象にしています。

import re
text = "私の電話番号は123-456-7890です。"
result = re.sub(r'\d', '*', text)
print(result)
私の電話番号は***-***-****です。

置換後の文字列指定

置換後の文字列は、単純な文字列だけでなく、キャプチャグループを使って動的に指定することもできます。

以下の例では、キャプチャグループを使って、置換後の文字列に元の数字を含めています。

import re
text = "私の電話番号は123-456-7890です。"
result = re.sub(r'(\d+)', r'[\1]', text)
print(result)
私の電話番号は[123]-[456]-[7890]です。

置換回数の制限

count引数を使うことで、置換する回数を制限できます。

以下の例では、最初の1回だけ数字を置換しています。

import re
text = "私の電話番号は123-456-7890です。"
result = re.sub(r'\d', '*', text, count=1)
print(result)
私の電話番号は*23-456-7890です。

フラグの使用方法

flags引数を使うことで、正規表現の動作を変更できます。

例えば、re.IGNORECASEを指定すると、大文字と小文字を区別せずにマッチングを行います。

以下の例では、”abc”と”ABC”の両方を置換しています。

import re
text = "abc ABC abc"
result = re.sub(r'abc', 'XYZ', text, flags=re.IGNORECASE)
print(result)
XYZ XYZ XYZ

このように、re.sub()関数を使うことで、正規表現に基づいた柔軟な文字列の置換が可能になります。

re.sub()の具体例

re.sub()関数は、さまざまな文字列操作に利用できます。

ここでは、具体的な例を通じてその使い方を解説します。

単純な文字列の置換

最も基本的な使い方は、単純な文字列を別の文字列に置換することです。

以下の例では、”猫”を”犬”に置換しています。

import re
text = "私は猫が好きです。猫はかわいいです。"
result = re.sub(r'猫', '犬', text)
print(result)
私は犬が好きです。犬はかわいいです。

特定のパターンに一致する部分を削除

特定のパターンに一致する部分を削除することも可能です。

以下の例では、すべての数字を削除しています。

import re
text = "2023年のイベントは、3月15日に開催されます。"
result = re.sub(r'\d+', '', text)
print(result)
年のイベントは、月日に開催されます。

大文字・小文字の変換

大文字・小文字の変換には、正規表現を使って特定の文字を置換する方法があります。

以下の例では、”hello”を”HELLO”に変換しています。

import re
text = "hello world! Hello everyone!"
result = re.sub(r'hello', 'HELLO', text, flags=re.IGNORECASE)
print(result)
HELLO world! HELLO everyone!

数字や記号の置換

数字や記号を特定の文字に置換することもできます。

以下の例では、すべての数字を”*”に置換しています。

import re
text = "パスワードは1234-5678です。"
result = re.sub(r'\d', '*', text)
print(result)
パスワードは****-****です。

複数のパターンを一度に置換

複数のパターンを一度に置換することも可能です。

以下の例では、”猫”を”犬”、”パスワード”を”秘密”に置換しています。

import re
text = "私は猫が好きです。パスワードは1234です。"
result = re.sub(r'猫|パスワード', lambda m: '犬' if m.group(0) == '猫' else '秘密', text)
print(result)
私は犬が好きです。秘密は1234です。

これらの具体例を通じて、re.sub()関数の多様な使い方が理解できるでしょう。

正規表現を活用することで、複雑な文字列操作も簡単に行えます。

キャプチャグループを使った置換

キャプチャグループを使用することで、正規表現のマッチ部分をより柔軟に扱うことができます。

以下では、キャプチャグループを使った置換の具体的な方法について解説します。

キャプチャグループの基本

キャプチャグループは、正規表現の中で特定の部分を括弧で囲むことで定義されます。

これにより、マッチした部分を後で参照することが可能になります。

以下の例では、日付の形式をキャプチャグループで指定しています。

import re
text = "今日は2023年3月15日です。"
result = re.sub(r'(\d+)年(\d+)月(\d+)日', r'\2/\1/\3', text)
print(result)
今日は3/2023/15です。

キャプチャグループを使った部分的な置換

キャプチャグループを使うことで、特定の部分だけを置換することができます。

以下の例では、”John”という名前を”Jane”に置換しています。

import re
text = "Johnはプログラマーです。JohnはPythonが得意です。"
result = re.sub(r'(John)', 'Jane', text)
print(result)
Janeはプログラマーです。JaneはPythonが得意です。

キャプチャグループの再利用

キャプチャグループを使うことで、マッチした部分を再利用することができます。

以下の例では、姓と名を入れ替えています。

import re
text = "山田 太郎"
result = re.sub(r'(\w+) (\w+)', r'\2 \1', text)
print(result)
太郎 山田

名前付きキャプチャグループの使用

名前付きキャプチャグループを使用すると、より可読性の高いコードを書くことができます。

以下の例では、日付を名前付きキャプチャグループで指定し、置換しています。

import re
text = "今日は2023年3月15日です。"
result = re.sub(r'(?P<year>\d+)年(?P<month>\d+)月(?P<day>\d+)日', r'\g<month>/\g<year>/\g<day>', text)
print(result)
今日は3/2023/15です。

このように、キャプチャグループを使うことで、正規表現のマッチ部分を柔軟に扱い、より複雑な置換処理を簡単に行うことができます。

名前付きキャプチャグループを使用することで、コードの可読性も向上します。

関数を使った動的な置換

re.sub()関数では、置換後の文字列を単純な文字列だけでなく、関数を使って動的に生成することも可能です。

これにより、より複雑な置換処理を行うことができます。

以下では、関数を使った動的な置換の方法について解説します。

re.sub()で関数を使う方法

re.sub()関数の第2引数に関数を指定することで、マッチした部分に対してその関数を適用し、置換後の文字列を生成します。

関数は、マッチオブジェクトを引数に取り、置換後の文字列を返す必要があります。

import re
def replace_function(match):
    return f"[{match.group(0)}]"
text = "猫と犬がいます。"
result = re.sub(r'猫|犬', replace_function, text)
print(result)
[猫]と[犬]がいます。

置換関数の作成方法

置換関数は、マッチオブジェクトを引数に取り、必要な処理を行った後に置換後の文字列を返すように作成します。

以下の例では、マッチした文字列を大文字に変換する関数を作成しています。

import re
def to_upper(match):
    return match.group(0).upper()
text = "apple banana cherry"
result = re.sub(r'\b\w+\b', to_upper, text)
print(result)
APPLE BANANA CHERRY

置換関数の具体例

以下の例では、日付の形式を変換する置換関数を作成しています。

元の形式は”YYYY-MM-DD”で、置換後の形式は”DD/MM/YYYY”です。

import re
def format_date(match):
    year = match.group(1)
    month = match.group(2)
    day = match.group(3)
    return f"{day}/{month}/{year}"
text = "今日は2023-03-15です。"
result = re.sub(r'(\d{4})-(\d{2})-(\d{2})', format_date, text)
print(result)
今日は15/03/2023です。

文字列の加工や変換に応用

置換関数を使うことで、文字列の加工や変換を柔軟に行うことができます。

以下の例では、電話番号の形式を変換する関数を作成しています。

元の形式は”123-456-7890″で、置換後の形式は”(123) 456-7890″です。

import re
def format_phone_number(match):
    area_code = match.group(1)
    number = match.group(2)
    return f"({area_code}) {number}"
text = "私の電話番号は123-456-7890です。"
result = re.sub(r'(\d{3})-(\d{3}-\d{4})', format_phone_number, text)
print(result)
私の電話番号は(123) 456-7890です。

このように、re.sub()関数に置換関数を組み合わせることで、動的な置換処理が可能になり、さまざまな文字列の加工や変換に応用できます。

応用例

re.sub()関数を使用することで、さまざまな実用的な文字列操作が可能です。

以下では、具体的な応用例をいくつか紹介します。

HTMLタグの除去

HTML文書からタグを除去するために、re.sub()を使用することができます。

以下の例では、HTMLタグをすべて削除しています。

import re
html_text = "<p>これは<p>サンプルのHTMLです。</p></p>"
result = re.sub(r'<.*?>', '', html_text)
print(result)
これはサンプルのHTMLです。

日付フォーマットの変換

日付のフォーマットを変換する際にもre.sub()が役立ちます。

以下の例では、”YYYY/MM/DD”形式の日付を”DD-MM-YYYY”形式に変換しています。

import re
date_text = "2023/03/15は特別な日です。"
result = re.sub(r'(\d{4})/(\d{2})/(\d{2})', r'\3-\2-\1', date_text)
print(result)
15-03-2023は特別な日です。

電話番号やメールアドレスのマスク処理

個人情報を保護するために、電話番号やメールアドレスをマスクすることができます。

以下の例では、電話番号の一部を”*”で隠しています。

import re
phone_text = "私の電話番号は123-456-7890です。"
result = re.sub(r'(\d{3})-(\d{3})-(\d{4})', r'\1-***-****', phone_text)
print(result)
私の電話番号は123-***-****です。

特定の単語を伏字にする

特定の単語を伏字にするためにもre.sub()を使用できます。

以下の例では、”秘密”という単語を”***”に置換しています。

import re
text = "これは秘密の情報です。秘密は守られなければなりません。"
result = re.sub(r'秘密', '***', text)
print(result)
これは***の情報です。***は守られなければなりません。

URLの正規化

URLを正規化するために、re.sub()を使用することもできます。

以下の例では、”http://”や”https://”を削除し、”www.”を追加しています。

import re
url_text = "http://example.comとhttps://example.orgにアクセスしてください。"
result = re.sub(r'https?://', 'www.', url_text)
print(result)
www.example.comとwww.example.orgにアクセスしてください。

これらの応用例を通じて、re.sub()関数の強力な機能を活用し、さまざまな文字列操作を効率的に行うことができることがわかります。

正規表現を使うことで、複雑なパターンにも対応可能です。

よくある質問

re.sub()で置換がうまくいかない原因は?

re.sub()で置換がうまくいかない場合、以下のような原因が考えられます。

  • 正規表現のパターンが間違っている: パターンが正しく指定されていないと、マッチしないため置換が行われません。
  • フラグの設定が不適切: 大文字・小文字を区別する場合、re.IGNORECASEフラグを指定しないと、意図した文字列がマッチしないことがあります。
  • 置換対象の文字列が存在しない: 置換対象の文字列が元の文字列に含まれていない場合、当然置換は行われません。

置換後の文字列に元のパターンを含めるには?

置換後の文字列に元のパターンを含めるには、キャプチャグループを使用します。

キャプチャグループを使うことで、マッチした部分を置換後の文字列に再利用できます。

以下のように記述します。

import re
text = "私の電話番号は123-456-7890です。"
result = re.sub(r'(\d{3})-(\d{3})-(\d{4})', r'\1-\2-****', text)
print(result)
私の電話番号は123-456-****です。

置換対象の文字列が複数行にまたがる場合はどうする?

置換対象の文字列が複数行にまたがる場合、re.DOTALLフラグを使用することで、改行文字も含めてマッチさせることができます。

以下のように記述します。

import re
text = """これはテストです。
次の行に移ります。
ここにもテストがあります。"""
result = re.sub(r'テスト.*?行', '置換完了', text, flags=re.DOTALL)
print(result)
これは置換完了があります。

このように、re.DOTALLフラグを使うことで、複数行にまたがる文字列を対象にした置換が可能になります。

まとめ

この記事では、Pythonのre.sub()関数を用いた正規表現による文字列の置換方法について詳しく解説しました。

具体的な使用例やキャプチャグループの活用、関数を使った動的な置換など、さまざまなテクニックを紹介し、実際の応用例を通じてその効果を示しました。

これらの知識を活かして、実際のプログラミングにおいて文字列操作を効率的に行うことができるでしょう。

ぜひ、実際のプロジェクトや日常のタスクにこれらのテクニックを取り入れて、よりスムーズな文字列処理を実現してください。

  • URLをコピーしました!
目次から探す