プログラミングで文章の中から特定の文字列を置換したい場合、正規表現がとても役に立ちます。
文字列の置換を習得すると、とても地道な作業を瞬時に終えることが出来るようになります。
この記事では、
・改行を含む文字列の置換
・後方参照の使い方
・より高速に文字列を置換する方法
など、より実践的な内容に関しても分かりやすく解説していきます。
正規表現の置換について正しく理解し、必要な場面で使いこなすことができるように頑張っていきましょう!
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
sub関数による正規表現での文字列置換
正規表現を使って文字列を置換する場合は、sub関数を使います。
sub関数の書き方:
re.sub(正規表現, “置換する文字列”, 置換対象の文字列)
sub関数では、
- 第一引数に正規表現を使った検索パターンを指定
- 第二引数に置換する文字列
- 第三引数に置換する文字列全体
を指定します。
こちらのサンプルコードを見てみましょう。
import re text = "子供用Bagや女性用バックなど様々なバッグを取り揃えています" text_mod = re.sub('バック|バッグ',"Bag",text) print (text_mod)
実行結果
子供用Bagや女性用Bagなど様々なBagを取り揃えています
reモジュールをimportするのを忘れないように気をつけましょう。
text変数のバック、バッグがそれぞれBagに置き換わっているのがわかりますね。
改行を含む文章の置換
電話番号のデータをアスタリスク(*)に置換する場合について見ていきましょう。
それぞれのデータはこのように行の先頭に電話番号が載っているとします。
070-1234-5678 Tokyo 080-1234-5678 Chiba 090-1234-5678 Saitama
このデータに対して先ほど紹介したsub関数を使って、電話番号の部分をアスタリスクに置換してみましょう。
こちらのサンプルコードを見てみましょう。
import re text = """\ 070-1234-5678 Tokyo 080-1234-5678 Chiba 090-1234-5678 Saitama """ text_mod = re.sub('^[0-9]{3}-[0-9]{4}-[0-9]{4}',"***-****-****",text) # 正規表現を使った置換 print (text_mod)
実行結果
***-****-**** Tokyo 080-1234-5678 Chiba 090-1234-5678 Saitama
1行目だけが置換されて、2行目以降は変わらない結果となりました。
これは正規表現で「^」(文字列の先頭)を指定しており、改行された2行目以降は文字列の先頭とは見なされないからです。
そこでsub関数に用意されている第四引数を使いましょう。
第四引数に「flags=re.MULTILINE」を指定すると、それぞれの行の先頭に対して置換をすることが出来ます。
import re text = """\ 070-1234-5678 Tokyo 080-1234-5678 Chiba 090-1234-5678 Saitama """ text_mod = re.sub('^[0-9]{3}-[0-9]{4}-[0-9]{4}',"***-****-****",text, flags=re.MULTILINE) # flags=re.MULTILINEを追加 print (text_mod)
実行結果
***-****-**** Tokyo ***-****-**** Chiba ***-****-**** Saitama
これで改行されたそれぞれの行に対して置換をすることが出来ましたね。
後方参照で一致した文字列の記憶
正規表現で一致した文字列は、後に使いまわすことも出来ます。
こちらのサンプルコードを見てみましょう。
import re text="""\ 1234567 東京都千代田区 3334444 東京都港区 9876543 東京都台東区 """ text_mod = re.sub(r'([0-9]{3})([0-9]{4})', r'\1-\2', text, flags=re.MULTILINE) print (text_mod)
このサンプルコードでは郵便番号の7桁を「3桁+ハイフン+4桁」の形式に置換しています。
ここで注目して欲しいのが、sub関数の第二引数で指定している「’\1-\2’」です。
これは後方参照と呼ばれる置換の方法です。
第一引数の最初のカッコで括りグループ化された内容([0-9]{3})が「\1」に格納され、次のカッコの内容([0-9]{4})が「\2」に格納されています。
「\1」と「\2」の間にあるハイフンは、それぞれ置換した文字列を繋いでいますね。
使い方にやや慣れが必要ですが、後方参照を正しく使うとプログラムもより見やすいものになりますよ。
正規表現の置換を高速に行う方法
正規表現を使った置換を高速に行うための工夫として、正規表現のパターンを事前にコンパイルする方法があります。
コンパイルはあまり聞き慣れない言葉かもしれませんが、正規表現のパターンを機械語に翻訳して事前に渡しておく作業になります。
こちらのサンプルコードを見てみましょう。
import re saleVal = re.compile('[0-9]{2}%') text1 = "毎月5日は全品30%オフを実施中!!!" text2 = "毎月10日は全品50%オフを実施中!!!" text_mod1 = saleVal.sub("80%",text1) text_mod2 = saleVal.sub("90%",text2) print (text_mod1) print (text_mod2)
実行結果
毎月5日は全品80%オフを実施中!!! 毎月10日は全品90%オフを実施中!!!
サンプルコードの2行目に注目してください。
ここでcompile関数を使い、正規表現の検索パターンを定義しています。
そして複数の置換する文字列(text1,text2)に対して、同じ正規表現の検索パターンを使っています。
置換する文字列はそれぞれで指定(80%,90%)しています。
こうすることで置換処理が高速となり、さらにプログラムが読みやすくなります。
まとめ
Pythonの正規表現の置換について、基本的な実装の仕方から実用的な具体例についても紹介しました。
正規表現を使いこなすことができるようになると、他の言語でも大きな力を発揮します。
正規表現を使って置換することを考える場面は今後も多く出てくると思います。
そのようなときは、ぜひこの記事を思い出し、読み返してみてください。
なお、今Pythonを学習している方は以下の記事もどうぞ。
はじめてPythonを使う方でもわかりやすいように、Pythonでできることやその学習法などを中心にまとめています。
復習にも使えると思いますので、ぜひ一度ご覧になってみてくださいね。
【Python 入門完全攻略ガイド】