Pythonにおける正規表現の習得
正規表現(regexまたはregexp)は、文字列内のパターンマッチングのための強力なツールです。Pythonのre
モジュールは、正規表現を扱うための包括的なインターフェースを提供し、高度なテキスト操作とデータ抽出を可能にします。このチュートリアルでは、必須の関数と概念を説明し、Pythonプロジェクトで正規表現の力を効果的に活用できるようにします。
目次
re.match()
:先頭からのマッチングre.search()
:最初のマッチングの検索re.compile()
:パフォーマンスの最適化- フラグ:マッチング動作の変更
- 文字セット:許容される文字の定義
re.sub()
による検索と置換re.findall()
:すべてのマッチングの抽出re.finditer()
:マッチングの反復処理re.split()
:パターンによる文字列の分割- 基本パターン:アンカー、文字クラス
- 繰り返し:量子化子と貪欲マッチングと非貪欲マッチング
- 特殊シーケンス:数字、空白、単語文字
re.escape()
:特殊文字の処理- キャプチャグループと
group()
メソッド
1. re.match()
:先頭からのマッチング
re.match()
関数は、文字列の先頭でのみパターンにマッチしようとします。成功した場合はマッチオブジェクトを、そうでない場合はNone
を返します。
import re
text = "Hello World"
pattern = "Hello"
match = re.match(pattern, text)
if match:
print("Match found:", match.group(0))
else:
print("No match found")
2. re.search()
:最初のマッチングの検索
re.search()
は、パターンが最初に発生する場所を文字列全体でスキャンします。re.match()
とは異なり、先頭でマッチする必要はありません。
import re
text = "Hello World"
pattern = "World"
match = re.search(pattern, text)
if match:
print("Match found:", match.group(0))
else:
print("No match found")
3. re.compile()
:パフォーマンスの最適化
特に同じパターンを繰り返し使用する場合は、re.compile()
を使用してコンパイルすることでパフォーマンスを向上させることができます。これにより、再利用可能なパターンオブジェクトが作成されます。
import re
compiled_pattern = re.compile(r"d+") # パターンのコンパイル
text1 = "There are 123 apples"
text2 = "And 456 oranges"
match1 = compiled_pattern.search(text1)
match2 = compiled_pattern.search(text2)
print(match1.group(0)) # 出力:123
print(match2.group(0)) # 出力:456
4. フラグ:マッチング動作の変更
フラグはマッチングプロセスを変更します。re.IGNORECASE
は大文字と小文字を区別しないマッチングを行い、re.MULTILINE
は各行を^
と$
アンカーに対して個別の文字列として扱います。
import re
text = "Hello world"
pattern = re.compile("hello", re.IGNORECASE)
match = pattern.search(text)
print(match.group(0)) # 出力:Hello
5. 文字セット:許容される文字の定義
文字セット([]
)は、許容される文字を指定します。たとえば、[a-z]
は小文字にマッチします。
import re
text = "abc123XYZ"
pattern = re.compile("[a-z]+")
match = pattern.search(text)
print(match.group(0)) # 出力:abc
6. re.sub()
による検索と置換
re.sub()
は、パターンを置換文字列で置き換えます。
import re
text = "Hello World"
new_text = re.sub("World", "Python", text)
print(new_text) # 出力:Hello Python
7. re.findall()
:すべてのマッチングの抽出
re.findall()
は、重複しないすべてのマッチングのリストを返します。
import re
text = "123 abc 456 def"
numbers = re.findall(r"d+", text)
print(numbers) # 出力:['123', '456']
8. re.finditer()
:マッチングの反復処理
re.finditer()
は、マッチオブジェクトを生成するイテレータを返します。大規模な文字列内の多数のマッチングに対して、よりメモリ効率が良いです。
import re
text = "123 abc 456 def"
for match in re.finditer(r"d+", text):
print(match.group(0)) # 出力:123、456(別々の行に)
9. re.split()
:パターンによる文字列の分割
re.split()
は、パターンに基づいて文字列を分割します。
import re
text = "apple,banana,cherry"
fruits = re.split(r",", text)
print(fruits) # 出力:['apple', 'banana', 'cherry']
10. 基本パターン:アンカー、文字クラス
.
:改行文字を除く任意の文字にマッチします。^
:文字列の先頭にマッチします。$
:文字列の末尾にマッチします。[]
:文字の集合にマッチします(例:[abc]
、[a-z]
)。[^...]
:集合に含まれない任意の文字にマッチします(否定文字集合)。
11. 繰り返し:量子化子と貪欲マッチングと非貪欲マッチング
*
:0回以上の出現。+
:1回以上の出現。?
:0回または1回の出現。{m}
:正確にm
回の出現。{m,n}
:m
回からn
回までの出現。*?
、+?
、??
、{m,n}?
:非貪欲バージョン(最短の文字列にマッチする)。
12. 特殊シーケンス:数字、空白、単語文字
d
:任意の数字(0~9)にマッチします。D
:任意の数字以外の文字にマッチします。s
:任意の空白文字(スペース、タブ、改行)にマッチします。S
:任意の空白文字以外の文字にマッチします。w
:任意の英数字(文字、数字、アンダースコア)にマッチします。W
:任意の英数字以外の文字にマッチします。
13. re.escape()
:特殊文字の処理
re.escape()
は文字列内の特殊文字をエスケープし、意図しない正規表現の解釈なしにリテラルパターンとして使用できるようにします。
14. キャプチャグループとgroup()
メソッド
括弧()
はキャプチャグループを作成します。group()
メソッドは、キャプチャされた部分文字列にアクセスします。
import re
text = "My phone number is 123-456-7890"
match = re.search(r"(d{3})-(d{3})-(d{4})", text)
if match:
area_code = match.group(1)
prefix = match.group(2)
line_number = match.group(3)
print(f"Area Code: {area_code}, Prefix: {prefix}, Line Number: {line_number}")
このチュートリアルは、Pythonのre
モジュールの堅実な基礎を提供します。高度なテクニックのさらなる探求は、文字列処理能力を大幅に向上させます。完全なリファレンスについては、公式のPythonドキュメントを参照してください。