文法・環境 組み込み関数

【Python正規表現】reモジュールのcompile関数の使い方

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】正規表現の貪欲・非貪欲マッチ

スポンサーリンク

-文法・環境, 組み込み関数
-,