はじめに
今回は正規表現を用いた文字列の置換について基本から解説します。自分の理解もあいまいだったので、一度、基本的なことを整理してみようと思います。具体例を用いて試しながら解説するので、記事を読み終えると、正規表現を使った文字列の置換の仕方がわかり自らコードを書くことができるようになります。
正規表現
正規表現について
正規表現については過去にも扱っているので、ここではメタ文字と特殊シーケンスをまとめたものを掲載するにととどめておきます。
<メタ文字と特殊シーケンス>
▶ 正規表現の基本を確認したい場合は、以下の2つの記事をご覧ください。
正規表現を用いた処理の方法
Pythonで正規表現を扱いには「re」というらライブラリを使います。調べてわけではないですが、正規表現は英語で「Regular Expression」なので「re」なんでしょうね。まずはこれをインポートします。
このあと、
- 関数で処理する方法
- 正規表現パターンオブジェクトのメソッドで処理する方法
の2通りがあります。前者は抽出・置換であれば、re.match()・re.sub()とするのに対して、後者はパターンオブジェクトを「pattern」とした場合、pattern.match()・pattern.sum()とします。実際に具体例で試してみましょう。
正規表現を用いた文字列の置換
先にご紹介した2つの方法をそれぞれ試してみましょう。今回はURLのリストに対して、「http」で始まるものは「https」に書き換えることにしましょう。但し、URLの中には「https」で始まるものもあり、この場合は置き換えないようにする必要があります。つまり、
- httpから始まる(httpsではない)URL→http部分をhttpsに置き換える
- httpsから始まるURL→置き換えをしない
となります。
関数を使って置換する
まずは関数を使って置換する方法を見ていきましょう。
# ライブラリのインポート
import re
# サンプルのテキストを用意
sample_urls = ['http://happy-analysis.com/','https://happy-analysis.com/','http://www.yahoo.co.jp/']
# 正規表現パターン
pattern = r'^http[^s]'
# httpをhttpsに置換
for url in sample_urls:
print(re.sub(pattern,'https',url))
1~2行目で「re」ライブラリのインポートをしています。次に4~6行目ではサンプルのURL作成しています。http://からはじまるものと、https://ではじまるものを準備しています。
8~9行目が正規表現のパターンです。まずhttpから始まるので「^http」としています。次に、「https」については置換せずにそのままとしたいので、「http」のあとにくるのが「s」以外のものを指定します。ここでは「否定の文字クラス」を使っています。^(キャレット)と角括弧[]と組み合わせると否定の意味になります。[^s]で「s以外」の意味となります。
11~13行目でfor文を回して置換を実行しています。ちゃんとhttpのものはhttpsに、httpsのものはそのまま、と期待通りの処理ができていますね。
re.sub()の書式は次のようになります。
patternに正規表現のパターン、rep1に置換文字列、stringに処理対象とする文字列を指定します。
パターンオブジェクトのメソッドを使って置換する
次にパターンオブジェクトのメソッドを使って置換するパターンです。
# ライブラリのインポート
import re
# サンプルのテキストを用意
sample_urls = ['http://happy-analysis.com/','https://happy-analysis.com/','http://www.yahoo.co.jp/']
# 正規表現パターンオブジェクトの作成
pattern = re.compile(r'^http[^s]')
# オブジェクトにsub()メソッドを適用
for i in range(len(sample_urls)):
print(pattern.sub('https',sample_urls[i]))
先ほどの違うのは、まず8~9行目で「re.compile」を使って正規表現パターンのオブジェクトを作っています。このオブジェクトのメソッドを使って11~13行目で置換しています。
正規表現パターンのオブジェクトのsub()メソッドの書式は以下となります。
まとめ
今回は正規表現による文字列の置換を扱いました。いままでなんとなく雰囲気で使っていたので、一度整理してみました。関数で処理する場合と、先にオブジェクトを作ってメソッドで処理する場合があります。同じ正規表現パターンを使った処理を繰り返し行う場合は、オブジェクトを作った処理の方が効率的ですね。
コメント