Python re.compile() メソッド
re.compile()は Pythonreモジュール内で正規表現をコンパイルするための関数です。
正規表現パターンを正規表現オブジェクトに事前にコンパイルすることで、繰り返し使用でき、マッチング効率を向上させます。
単語の意味: compile「コンパイル」、つまり Compile という意味です。
基本構文とパラメータ
re.compile()コンパイル済みの正規表現オブジェクトを作成するために使用されます。
構文形式
re.compile(pattern, flags=0)
パラメータの説明
- pattern:
- 型:文字列 (str)
- 説明:コンパイルする正規表現パターン。
- flags:
- 型:整数 (int, オプション)
- 説明:正規表現フラグ、例えば
re.IGNORECASE、re.MULTILINEなど。| を使用して|複数のフラグを組み合わせることができます。
関数の説明
- 戻り値: コンパイル済みの正規表現オブジェクトを返します (re.Pattern
re.Patternオブジェクト)。 - 特徴: コンパイル済みのオブジェクトは繰り返し使用でき、毎回呼び出す
re.search()などの関数を呼び出して正規表現を再解析するより効率的です。
例
単純なものから複雑なものまでの一連の例を通して、徹底的にre.compile()の使い方をマスターしましょう。
例1:基本的な使い方 - 正規表現をコンパイルする
例
import re
# 正規表現をコンパイルする
pattern = re.compile(r'\d+')
# コンパイル済みのオブジェクトを使用してマッチングを行う
text = 私は3個のりんごと5個のオレンジを持っています
result = pattern.findall(text)
print(見つかった数字:, result)
# 正規表現をコンパイルする
pattern = re.compile(r'\d+')
# コンパイル済みのオブジェクトを使用してマッチングを行う
text = 私は3個のりんごと5個のオレンジを持っています
result = pattern.findall(text)
print(見つかった数字:, result)
実行結果の予想:
找到的数字: ['3', '5']
コードの解説:
re.compile(r'\d+')1つ以上の数字にマッチする正規表現をコンパイルします。- コンパイル後に返される
patternオブジェクトにはfindall()、search()、match()などのメソッドがあります。 - コンパイル済みのオブジェクトを使用してマッチングを行う方が効率的です。
例2:同じパターンを複数回使用する
正規表現をコンパイルする最大の利点は、繰り返し使用でき、重複した解析を避けられることです。
例
import re
# メールアドレスにマッチする正規表現をコンパイルする
email_pattern = re.compile(r'\w+@\w+\.\w+')
# 複数のテキストで繰り返し使用する
texts = [
[email protected] に連絡してヘルプを求める,
メール: [email protected],
送信者: [email protected]
]
for text in texts:
result = email_pattern.search(text)
if result:
print(f見つかったメール: {result.group()})
# メールアドレスにマッチする正規表現をコンパイルする
email_pattern = re.compile(r'\w+@\w+\.\w+')
# 複数のテキストで繰り返し使用する
texts = [
[email protected] に連絡してヘルプを求める,
メール: [email protected],
送信者: [email protected]
]
for text in texts:
result = email_pattern.search(text)
if result:
print(f見つかったメール: {result.group()})
実行結果の予想:
找到邮箱: [email protected] 找到邮箱: [email protected] 找到邮箱: [email protected]
コードの解説:
- 正規表現を一度だけコンパイルし、複数のテキストで繰り返し使用します。
- コンパイル済みのオブジェクトは複数回、
search()、findall()などのメソッドを呼び出すことができます。
例3:フラグを使用する
コンパイル時に正規表現フラグを指定して、マッチングの動作を変更できます。
例
import re
# コンパイル時に大文字小文字を無視するフラグを指定する
pattern = re.compile(r'python', re.IGNORECASE)
text = "Python is great, PYTHON is powerful"
# コンパイル済みのオブジェクトを使用して検索する
result = pattern.findall(text)
print(見つかった:, result)
# コンパイル時に大文字小文字を無視するフラグを指定する
pattern = re.compile(r'python', re.IGNORECASE)
text = "Python is great, PYTHON is powerful"
# コンパイル済みのオブジェクトを使用して検索する
result = pattern.findall(text)
print(見つかった:, result)
実行結果の予想:
找到: ['Python', 'PYTHON']
コードの解説:
re.IGNORECASEマッチングで大文字と小文字を区別しないようにします。- コンパイル時にフラグを指定すると、このオブジェクトを使用するすべての操作にそのフラグが適用されます。
例4:グループを使用する
コンパイル済みのオブジェクトは、グループを使用して特定の内容を抽出できます。
例
import re
# グループを使用して正規表現をコンパイルする
pattern = re.compile(r'(\d{3})-(\d{4})-(\d{4})')
text = 山田: 138-1234-5678, 佐藤: 139-9876-5432
# すべてのマッチを検索する
results = pattern.findall(text)
for result in results:
print(f完全: {result)
print(f第1グループ(最初の3桁): {result)
print(f第2グループ(中央の4桁): {result)
print(f第3グループ(最後の4桁): {result)
# グループを使用して正規表現をコンパイルする
pattern = re.compile(r'(\d{3})-(\d{4})-(\d{4})')
text = 山田: 138-1234-5678, 佐藤: 139-9876-5432
# すべてのマッチを検索する
results = pattern.findall(text)
for result in results:
print(f完全: {result)
print(f第1グループ(最初の3桁): {result)
print(f第2グループ(中央の4桁): {result)
print(f第3グループ(最後の4桁): {result)
実行結果の予想:
完整: 138-1234-5678 第1组(前3位): 138 第2组(中间4位): 1234 第3组(后4位): 5678 完整: 139-9876-5432 第1组(前3位): 139 第2组(中间4位): 9876 第3组(后4位): 5432
コードの解説:
- 丸括弧
()3つのグループを作成します。 findall()タプルのリストを返します。各タプルには各グループの内容が含まれます。
例5:コンパイル済みオブジェクトの属性
コンパイル済みの正規表現オブジェクトには、いくつかの便利な属性があります。
例
import re
# 正規表現をコンパイルする
pattern = re.compile(r'\d+', re.IGNORECASE | re.MULTILINE)
print(パターン:, pattern.pattern)
print(フラグ:, pattern.flags)
print(グループ数:, pattern.groups)
print(グループ名:, pattern.groupindex)
# 正規表現をコンパイルする
pattern = re.compile(r'\d+', re.IGNORECASE | re.MULTILINE)
print(パターン:, pattern.pattern)
print(フラグ:, pattern.flags)
print(グループ数:, pattern.groups)
print(グループ名:, pattern.groupindex)
実行結果の予想:
模式: \d+
标志: 50
分组数: 1
分组名: {}
コードの解説:
pattern.pattern- 元のパターン文字列を返します。pattern.flags- フラグの整数値を返します。pattern.groups- グループ数を返します。pattern.groupindex- 名前付きグループの辞書を返します。
例6:re モジュールの関数との比較
例
import re
text = "ABC123DEF"
# 方法1: re モジュールの関数を直接使用する
result1 = re.search(r'\d+', text)
# 方法2: 先にコンパイルし、その後コンパイル済みのオブジェクトを使用する
pattern = re.compile(r'\d+')
result2 = pattern.search(text)
print("re.search():", result1.group())
print("pattern.search():", result2.group())
# 2つの方法の結果は同じですが、コンパイル済みのオブジェクトは再利用できます
text = "ABC123DEF"
# 方法1: re モジュールの関数を直接使用する
result1 = re.search(r'\d+', text)
# 方法2: 先にコンパイルし、その後コンパイル済みのオブジェクトを使用する
pattern = re.compile(r'\d+')
result2 = pattern.search(text)
print("re.search():", result1.group())
print("pattern.search():", result2.group())
# 2つの方法の結果は同じですが、コンパイル済みのオブジェクトは再利用できます
実行結果の予想:
re.search(): 123 pattern.search(): 123
コードの解説:
- 2つの方法の結果は同じです。
- 同じパターンを複数回使用する必要がある場合は、
re.compile()事前にコンパイルすることをお勧めします。
その他の拡張