re.sub() / re.split() / re.compile()
| 対応: | Python 2(2000) |
|---|
正規表現を使った文字列の置換・分割・パターンのコンパイルを行う関数です。テキスト加工やパーサー処理でよく使います。
構文
import re # パターンに一致した部分を置換する 新文字列 = re.sub(パターン, 置換文字列, 文字列) 新文字列, 件数 = re.subn(パターン, 置換文字列, 文字列) # パターンで文字列を分割する リスト = re.split(パターン, 文字列) # パターンをコンパイルして再利用する pattern = re.compile(パターン) pattern.search(文字列) pattern.findall(文字列)
関数一覧
| 関数 | 概要 |
|---|---|
| re.sub(pattern, repl, string, count=0) | 文字列中でパターンに一致した部分を置換文字列に置き換えます。『count』で最大置換回数を指定できます。置換した新しい文字列を返します。 |
| re.subn(pattern, repl, string) | 『re.sub()』と同じですが、戻り値が『(置換後文字列, 置換件数)』のタプルになります。 |
| re.split(pattern, string, maxsplit=0) | パターンに一致した箇所で文字列を分割し、リストで返します。キャプチャグループがあるとセパレータも含めて返します。 |
| re.compile(pattern, flags=0) | 正規表現パターンをコンパイルして再利用可能なオブジェクトを返します。同じパターンを繰り返し使う場合に効率的です。 |
サンプルコード
re_sub_basic.py
import re
text = '孫悟空 vs ベジータ vs 孫悟空'
result = re.sub(r'孫悟空', 'ブロリー', text)
print(result)
messy = 'ブルマ クリリン ピッコロ'
clean = re.sub(r'\s+', ' ', messy)
print(clean)
date = '2025/04/15'
iso = re.sub(r'(\d{4})/(\d{2})/(\d{2})', r'\1-\2-\3', date)
print(iso)
実行すると次のように出力されます。
python3 re_sub_basic.py ブロリー vs ベジータ vs ブロリー ブルマ クリリン ピッコロ 2025-04-15
re_sub_split.py
import re new_text, count = re.subn(r'\d+', 'N', '戦闘力1000と戦闘力2000と戦闘力3000') print(new_text) print(str(count) + '件置換しました。') csv_like = '孫悟空,ベジータ、ブルマ クリリン' names = re.split(r'[,、\s]+', csv_like) print(names)
実行すると次のように出力されます。
python3 re_sub_split.py 戦闘力Nと戦闘力Nと戦闘力N 3件置換しました。 ['孫悟空', 'ベジータ', 'ブルマ', 'クリリン']
re_compile_reuse.py
import re
email_pattern = re.compile(r'[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}')
emails = [
'goku@capsule-corp.jp',
'not-an-email',
'vegeta@capsule-corp.jp',
]
for e in emails:
if email_pattern.fullmatch(e):
print(e + ' は有効です。')
else:
print(e + ' は無効です。')
実行すると次のように出力されます。
python3 re_compile_reuse.py goku@capsule-corp.jp は有効です。 not-an-email は無効です。 vegeta@capsule-corp.jp は有効です。
よくあるミス
よくあるミス1: キャプチャグループを含むパターンで分割するとセパレータも含まれる
『re.split()』でキャプチャグループ付きのパターンを使うと、分割した結果にセパレータの文字列も含まれます。セパレータを含めたくない場合は非キャプチャグループ(『(?:...)』)を使えます。
mistake1_ng.py
import re text = 'ブルマ,ピッコロ,クリリン' parts = re.split(r'(,)', text) print(parts)
実行すると次のように出力されます。
python3 mistake1_ng.py ['ブルマ', ',', 'ピッコロ', ',', 'クリリン']
mistake1_ok.py
import re text = 'ブルマ,ピッコロ,クリリン' parts = re.split(r'(?:,)', text) print(parts)
実行すると次のように出力されます。
python3 mistake1_ok.py ['ブルマ', 'ピッコロ', 'クリリン']
よくあるミス2: sub()の置換文字列でバックスラッシュ参照が機能しない
置換文字列の中でキャプチャグループを参照するときは、生文字列(『r"\1"』)を使わないとバックスラッシュが二重解釈されて意図通りに動きません。
mistake2_ng.py
import re
text = '孫悟空 2025-04-15'
result = re.sub(r'(\d{4})-(\d{2})-(\d{2})', '\1/\2/\3', text)
print(result)
実行すると次のように出力されます。
python3 mistake2_ng.py 孫悟空 /
mistake2_ok.py
import re
text = '孫悟空 2025-04-15'
result = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\1/\2/\3', text)
print(result)
実行すると次のように出力されます。
python3 mistake2_ok.py 孫悟空 2025/04/15
概要
『re.sub()』の置換文字列にはキャプチャグループの参照(『\1』、『\2』など)を使えます。また置換文字列の代わりに関数を渡すと、マッチごとに動的に置換文字列を生成することもできます。
『re.split()』はキャプチャグループを含むパターンで分割すると、セパレータに一致した文字列もリストに含まれます。セパレータを含めたくない場合は非キャプチャグループ(『(?:...)』)を使えます。
『re.compile()』は同じパターンを繰り返し使う場合にパフォーマンスが向上します。ただしPython内部でもある程度キャッシュが効くため、数回程度の使用ではコンパイルの効果はほとんどありません。ループ内で大量に使う場合に特に有効です。
パターンのマッチングは『re.match() / re.search() / re.fullmatch()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。