Pythonの標準ライブラリであるreモジュールのcompile( )関数の使用方法について紹介します。
本記事では、以下の内容を紹介しています。
この記事で分かること
- compile( )関数について
- compile( )関数のサンプルコード
Pythonの正規表現については、以下の記事も併せて参考にしてみてください。
【Python】正規表現の基本的な使用方法【reモジュール】
【Python】正規表現の具体的な使用例【日付、電話番号、メールアドレス、URL】
【Python】正規表現の特殊シーケンスについて【バックスラッシュ、円マーク】
【Python】正規表現の貪欲・非貪欲マッチ
スポンサーリンク
reモジュールのcompile( )関数について
"reモジュール"は正規表現を扱うことができる、Pythonの標準ライブラリです。
このreモジュールのcompile( )関数を使用することで、正規表現パターンをオブジェクトとして生成することができます。
正規表現オブジェクトを用いることで、何度も同じ正規表現を記述することなく、効率的に文字列の検索や置換を行うことができます。
はじめに、compile関数を使用した場合と、使用しない場合の、reモジュールの記述方法の違いを紹介します。
なお、例題として、こちらの文字列を例に説明します。
s = 'ページ番号:123 更新日:2022/11/2' + '\n' + \
'○○区役所庁舎案内' + '\n' + \
'電話:03-1234-5566(代表)'+ '\n' + \
'特設サイト:https://www.city.xxx.tokyo.jp/toiawase/'
compile()関数を使用しない場合
compile( )関数を使用しないサンプルコードです。
正規表現で電話番号を抽出しています。
import re
pattern = r'[(]?\d{2,4}[-)]?\d{2,4}-\d{3,4}'
res = re.findall(pattern, s)
print(res)
# ['03-1234-5566']
reモジュールのfindall関数に、正規表現パターンと、対象文字列を指定して、検索しています。
compile()関数を使用した場合
compile( )関数を使用するサンプルコードです。
import re
pattern = re.compile(r'[(]?\d{2,4}[-)]?\d{2,4}-\d{3,4}')
print(type(pattern))
# <class 're.Pattern'>
print(pattern)
# re.compile('[(]?\\d{2,4}[-)]?\\d{2,4}-\\d{3,4}')
res = pattern.findall(s)
print(res)
# ['03-1234-5566']
> pattern = re.compile(r'[(]?\d{2,4}[-)]?\d{2,4}-\d{3,4}')
正規表現オブジェクトを生成しています。
> res = pattern.findall(s)
正規表現オブジェクトのfindall( )メソッドを用いて、対象の文字列から、パターンを検索しています。
同じ正規表現パターンを何度も使用する場合は、正規表現オブジェクトを生成する効率よく検索できます。
例えば、forループの中で繰り返し検索・置換を行う場合に有効です。
以降で、forループ内で繰り返し置換処理を行うサンプルコードを紹介します。
スポンサーリンク
compile( )関数のサンプルコード
forループ内で繰り返し置換処理を行うサンプルコードです。
import re
s = 'Aさんの電話番号 : 03-1234-5678' + '\n' + \
'Bさんの電話番号 : 090-1234-5678' + '\n' + \
'Cさんの電話番号 : 0120-12-3456' + '\n' + \
'Dさんの電話番号 : 0120-123-456' + '\n' + \
'Eさんの電話番号 : (03)1234-5678' + '\n' + \
'数値 : 1234567891'
s_list = s.splitlines()
pattern = re.compile(r'[(]?\d{2,4}[-)]?\d{2,4}-')
for line in s_list:
line = pattern.sub('***-****-', line)
print(line)
# Aさんの電話番号 : ***-****-5678
# Bさんの電話番号 : ***-****-5678
# Cさんの電話番号 : ***-****-3456
# Dさんの電話番号 : ***-****-456
# Eさんの電話番号 : ***-****-5678
# 数値 : 1234567891
電話番号の正規表現パターンと一致した場合のみ、置き換えが行われています。
正規表現オブジェクトを用いることで、ループ内の処理速度も向上します。
正規表現に関しては、他にも使用方法をまとめています。併せて参考にしてみてください。
【Python】正規表現の基本的な使用方法【reモジュール】
【Python】正規表現の具体的な使用例【日付、電話番号、メールアドレス、URL】
【Python】正規表現の特殊シーケンスについて【バックスラッシュ、円マーク】
【Python】正規表現の貪欲・非貪欲マッチ
スポンサーリンク