Pythonで文字列を扱う際、「この形式の文字列だけ抽出したい」「一部の文字だけを置き換えたい」といった場面はよくあります。そんなときに威力を発揮するのが「正規表現」です。Pythonでは標準ライブラリのre
モジュールを使うことで、強力かつ柔軟な文字列処理が可能になります。本記事では、Pythonにおける正規表現の基本から応用まで、丁寧に解説していきます。これを読めば、正規表現の基礎がしっかり身につくでしょう。
正規表現(Regular Expression)は、文字列のパターンを表現するための特別な記述方法です。
たとえば、メールアドレスや郵便番号、電話番号のような「一定のルールを持った文字列」を検出したり抽出したりする際に使われます。
正規表現はPythonだけでなく、多くのプログラミング言語やツールで採用されている共通の技術です。Pythonではre
という標準モジュールを使って扱います。
まずは、Pythonで正規表現を使うために必要なre
モジュールの基本的な関数を紹介します。
import re
result = re.match(r'\d+', '123abc')
print(result.group()) # 結果:123
match()
は、文字列の先頭がパターンに一致するかどうかを確認します。
result = re.search(r'\d+', 'abc123def456')
print(result.group()) # 結果:123
search()
は文字列全体を検索し、最初にマッチした部分を返します。
result = re.findall(r'\d+', 'abc123def456ghi789')
print(result) # 結果:['123', '456', '789']
findall()
は、文字列中のすべてのマッチをリストで返します。
result = re.sub(r'\d+', '###', 'abc123def456')
print(result) # 結果:abc###def###
sub()
は、正規表現に一致した部分を他の文字列に置換します。
以下に、正規表現でよく使われるパターンを紹介します。
パターン | 意味 | 例 |
---|---|---|
\d | 数字(0-9) | \d+ → 数字の連続 |
\w | 英数字(a-z, A-Z, 0-9, _) | \w+ → 単語 |
. | 任意の1文字 | a.b → acb, a1b など |
^ | 行頭を意味する | ^abc → abcで始まる行 |
$ | 行末を意味する | xyz$ → xyzで終わる行 |
[] | 文字クラス | [a-z] → 小文字1文字 |
` | ` | または(OR) |
* | 直前の文字の0回以上の繰り返し | a* → “”, “a”, “aaa”など |
+ | 直前の文字の1回以上の繰り返し | a+ → “a”, “aa”など |
{n,m} | n〜m回の繰り返し | a{2,4} → “aa”, “aaa”, “aaaa” |
次は、具体的な実用例として「文字列の中からメールアドレスを抽出する」方法です。
text = "お問い合わせは info@example.com までお願いします。"
pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
email = re.search(pattern, text)
if email:
print(email.group()) # 結果:info@example.com
このパターンは、メールアドレスの基本的な形式にマッチします。
業務やデータ分析で非常によく使われるテクニックです。
text = "登録日は2025-04-13です。"
pattern = r'\d{4}-\d{2}-\d{2}'
date = re.search(pattern, text)
if date:
print(date.group()) # 結果:2025-04-13
{4}
や{2}
のように、繰り返し回数を指定することで特定の形式にマッチさせることができます。
繰り返し使うパターンは、re.compile()
で事前にコンパイルしておくことでパフォーマンスを上げられます。
pattern = re.compile(r'\d+')
result = pattern.findall('123abc456def')
print(result) # 結果:['123', '456']
re.compile()
で作成したパターンオブジェクトは、match()
, search()
, findall()
などと同様のメソッドを持っています。
正規表現では \
を多く使うため、Pythonの文字列でそのまま書くと混乱しやすいです。
そのため、文字列の前に r
を付けて「生(raw)文字列」として記述するのが一般的です。
pattern = r'\d+' # これが正しい
r'\d+'
とすることで、Pythonが\d
をエスケープしようとせず、正規表現そのままの意味として解釈してくれます。
Pythonの正規表現は強力で、複雑な文字列のパターンマッチや変換を柔軟に行えます。
ログファイルの解析、データクレンジング、フォームのバリデーションなど、さまざまな場面で活用されています。
最初は覚えることが多く感じられますが、基本のパターンをしっかり理解していれば徐々に応用できるようになります。
まずはre.search()
やre.findall()
など、使いやすい関数から試してみると良いでしょう。
re
モジュールを利用するmatch()
, search()
, findall()
, sub()
などの関数を目的に応じて使い分ける\d
, \w
, ^
, $
, +
, *
などの記号を理解するとパターン作成がしやすくなるre.compile()
でコンパイルして再利用可能にすると効率が良い