Pythonの正規表現(reモジュール)の基本!パターンマッチングを学ぼう
生徒
「Pythonで、特定の文字だけを探したり、文字のパターンを見つけたりすることってできますか?」
先生
「はい、それには正規表現(せいきひょうげん)という方法があります。Pythonではreモジュールを使って、それが簡単にできますよ。」
生徒
「正規表現って難しそうですが、初心者でも使えるんですか?」
先生
「もちろんです。まずは基本だけをゆっくり学べば大丈夫です。一緒にパターンマッチングの基本を学んでいきましょう!」
1. 正規表現とは?初心者向けにやさしく解説
正規表現(Regular Expression)とは、特定の「文字の並び方のルール(パターン)」を決めて、膨大なテキストの中から目的の情報を効率よく探し出すための技術です。
プログラミング未経験の方でも、「WordやExcelの検索機能の、もっとすごい版」と考えるとイメージしやすいでしょう。例えば、「文章の中からメールアドレスだけをすべて抜き出したい」といった、手作業では時間がかかる処理も、正規表現を使えば一瞬で終わります。
- 入力された電話番号の形式(ハイフンの位置など)が正しいかチェックする
- 大量の名簿から「090」で始まる番号だけを抽出する
- 不適切な言葉を自動的に「***」に置き換える(伏せ字にする)
Pythonでは、標準ライブラリのre(アール・イー)というモジュールを読み込むだけで、すぐにこの強力な機能を使えるようになります。
まずは、最もシンプルな「特定の単語が含まれているか」を確認するサンプルを見てみましょう。
import re
# 探したい対象の文章
text = "今日はPythonの勉強をしています。"
# 「Python」という文字が含まれているかチェック
if re.search(r"Python", text):
print("見つかりました!")
else:
print("見つかりませんでした。")
このコードでは、re.search()を使って、文章の中に指定したパターン(今回は"Python"という文字そのもの)が存在するかを判定しています。このように、単純な文字探しから複雑なデータ抽出まで幅広くこなせるのが正規表現の魅力です。
2. reモジュールの使い方と基本の関数
Pythonで正規表現を扱うには、標準ライブラリのreモジュールを使用します。このモジュールには多くの機能がありますが、プログラミング未経験の方や初心者の方は、まず以下の「基本の3大関数」をマスターすることから始めましょう。これだけで日常的なテキスト処理の多くをカバーできます。
- re.search():文字列全体をスキャンして、特定のパターンが「最初に見つかった場所」を抜き出します。
- re.findall():条件に合うものを「すべて」探し出し、リスト形式でまとめて取得します。
- re.sub():不要な文字を削除したり、別の文字に「置換(置き換え)」したりする際に便利です。
まずは、最もよく使われる「特定の文字パターンを探し出す」プログラムを実際に動かしてみましょう。例えば、文章の中から電話番号のような「数字の並び」だけを自動で抽出する方法です。
import re
# 検索対象のテキスト
text = "私の電話番号は090-1234-5678です。お問い合わせください。"
# 探したいパターン(数字の並び)を指定
# \dは「数字」、{n,m}は「n回からm回の繰り返し」を意味します
pattern = r"\d{2,4}-\d{2,4}-\d{4}"
# search関数でパターンに一致する部分を探す
result = re.search(pattern, text)
# 見つかった場合、その中身を表示する
if result:
print("見つかった文字列:", result.group())
見つかった文字列: 090-1234-5678
上記のコードで使用している\dは、正規表現で「0から9までの数字」を指す特殊な記号です。また、{2,4}と書くことで「2文字以上、4文字以下の連続した数字」という条件を指定しています。
このように、正規表現を使うと「具体的な数字そのもの」を知らなくても、「数字がハイフンでつながっている形式」というルールの特徴だけで、目的の情報をピンポイントで見つけ出すことができるようになります。
3. パターンマッチングとは何か?初心者向けにわかりやすく解説
パターンマッチングとは、対象となるデータ(文字列など)が、あらかじめ決めた「特定のルール(パターン)」に合致しているかどうかをチェックする仕組みのことです。
プログラミング未経験の方でも、Webサイトの会員登録で「メールアドレスの形式が正しくありません」や「パスワードは英数字8文字以上で入力してください」といった警告を見たことがあるはずです。実は、あの裏側で動いているのがパターンマッチングです。
身近な例え:
「郵便番号の入力欄」を想像してみてください。ここに「あいうえお」と入力されたら困りますよね?「数字3桁 + ハイフン + 数字4桁」というルールに合格するかどうかを判定するのが、パターンマッチングの役割です。
まずは、Pythonを使って「特定のルールに合っているか」を判定する、最もシンプルなコードを見てみましょう。ここでは「英字が3つ + 数字が3つ」というルールを作ってみます。
import re
# チェックしたい文字列(ここを変えて試してみましょう)
text = "abc123"
# ルールを決める([a-z]{3}は英小文字3つ、\d{3}は数字3つという意味)
pattern = r"[a-z]{3}\d{3}"
# 文字列がルールに「ぴったり」合っているか確認
if re.fullmatch(pattern, text):
print("判定結果:ルール通りです!正しい形式です。")
else:
print("判定結果:ルールに合いません。入力内容を確認してください。")
判定結果:ルール通りです!正しい形式です。
このように、パターンマッチングを活用することで、人間が一つひとつ目視で確認しなくても、プログラムが瞬時に「正しいデータかどうか」を自動判別してくれます。データの整理や入力ミス防止には欠かせない技術です。
4. よく使う正規表現の記号一覧と具体的な使い方
正規表現は一見すると「暗号」のように見えますが、一つひとつの記号の意味を理解すれば、驚くほど便利にデータを扱えるようになります。ここでは、プログラミング初心者の方がまず最初に覚えるべき基本の記号を、具体的なサンプルを交えて詳しく解説します。
| 記号 | 意味と役割 |
|---|---|
. |
任意の1文字:何でもいいから1文字分を表現します。 |
\d |
数字:0から9までの数字のどれか1つを指します。 |
\w |
英単語文字:アルファベット、数字、アンダースコア(_)を指します。 |
+ |
1回以上の繰り返し:直前の文字が1つ以上続く場合にマッチします。 |
{n} |
n回の繰り返し:指定した回数分だけ繰り返す場合にマッチします。 |
【実践サンプル】電話番号やIDの形式をチェックする
例えば、「3桁の数字」を探したい場合は \d{3} と書きます。これを利用して、Pythonで簡単なパターンマッチングを試してみましょう。
import re
# チェックしたい文字列
tel_sample = "090"
# \d{3} は「数字が3回連続する」という意味です
if re.match(r"\d{3}", tel_sample):
print("3桁の数字を確認しました!")
同様に、PHPでもユーザーが入力したID(英数字)が正しい形式かチェックする際などに活用されます。\w+ を使うことで「1文字以上の英数字」をまとめて表現できます。
$user_id = "user_777";
// \w+ は「英数字が1文字以上続いている」状態を指します
if (preg_match("/\w+/", $user_id)) {
echo "有効なユーザーID形式です。";
}
\d(小文字)は数字を表しますが、\D(大文字)にすると「数字以外」という意味になります。このように、大文字と小文字で意味が反転するのも正規表現の面白い特徴です。
5. メールアドレスを見つける具体的な活用例
正規表現の真骨頂とも言えるのが、文章の中から特定のルールに沿った文字列だけを抽出する機能です。その代表例であるメールアドレスの抽出を、初心者の方でも分かりやすく解説します。
一見すると「呪文」のように見える正規表現のパターンも、分解してみれば「@(アットマーク)の前は英数字」「最後はドット(.)で終わる英単語」といったシンプルな条件の組み合わせに過ぎません。
import re
# 対象となる文章
text = "お問い合わせは info@example.com まで。担当者の個人アドレスは user123@test.jp です。"
# メールアドレスを抽出するためのパターン
# [a-zA-Z0-9._%+-]:英数字や一部の記号
# +@:その後に@が続く
# [a-zA-Z0-9.-]:ドメイン部分の英数字
# +\.[a-zA-Z]{2,}:ドットの後に2文字以上の英単語が続く
pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
# findallを使うと、文章内のすべてのメールアドレスをリスト形式で取得できます
results = re.findall(pattern, text)
for mail in results:
print(f"見つかったアドレス: {mail}")
見つかったアドレス: info@example.com
見つかったアドレス: user123@test.jp
プログラミング未経験の方にとっては、最初は「+」や「{2,}」といった記号が難しく感じるかもしれません。しかし、これらは「1回以上の繰り返し」や「2文字以上」といった回数を指定しているだけです。
このように、複雑に見えるパターンでも、パズルを組み立てるように分解して理解することで、膨大なデータの中から必要な情報だけを一瞬で取り出すことが可能になります。まずは「コピーして動かす」ことから始めて、徐々に記号の意味に慣れていきましょう。
6. 文字の置き換え(re.subの使い方)
文章の中の文字を別の文字に一括で置き換えることもできます。
たとえば、全角の数字を半角に置き換えるなどの処理が可能です。
import re
text = "電話:090-1234-5678、FAX:03-9876-5432"
result = re.sub(r"\d{2,4}-\d{2,4}-\d{4}", "非公開", text)
print(result)
電話:非公開、FAX:非公開
7. 正規表現の使い方を練習しよう
実際に自分で文字列を作って、どんな文字がマッチするのかを試してみましょう。文字列を変更しながら何度も実行することで、自然に身についてきます。
初心者の方は、まずは re.search() や re.findall() を中心に、パターンマッチングの感覚をつかむことから始めましょう。
まとめ
Pythonの正規表現は、文字列の中から必要な情報を抽出したり、特定のルールに合う文字だけを見つけたり、文章を効率よく加工したりするために欠かせない重要な機能です。正規表現というと難しい印象を持たれがちですが、実際には「文字のルールを決めて検索する」というシンプルな考え方で構成されており、基本的な記号と関数の使い方を覚えれば、初心者でも十分に活用できます。今回の記事では、reモジュールの基本的な関数であるre.search()、re.findall()、re.sub()の使い方や、よく使われる正規表現の記号、そしてパターンマッチングの基本的な考え方を紹介してきました。これらの知識を身につけることで、文章中から電話番号やメールアドレスを抽出したり、数字だけを取り出して加工したり、特定のパターンを満たす文字列を判定したりと、文字処理の幅が大きく広がります。 正規表現を使いこなすメリットは、ただ単に文字を探すだけにとどまりません。複雑な条件の検索や抽出を短いコードで表現できるため、処理を簡潔に書けるだけでなく、効率面でも大きな効果があります。もし正規表現を使わずに同じ処理を行おうとすると、多くの条件分岐やループが必要になり、コードが長く読みづらいものになってしまうことも珍しくありません。逆に、正規表現を理解しておけば、数行のシンプルなコードで複雑な条件を表現でき、可読性と保守性が高いプログラムを書くことができるようになります。また、Web開発やデータ分析、ログ解析、テキスト処理など、多くの分野で必要とされる技術でもあるため、正規表現を学んでおくことは、Pythonを本格的に使っていく上で大きな強みになります。 もちろん、正規表現は一度にすべてを覚える必要はなく、必要に応じてパターンを調べながら使うことで、自然と表現が身についていきます。最初は数字を表す \d や、文字の繰り返しを表す +・* といった基本記号だけでも十分に多くの場面で活躍します。そして、文章の置換や複雑な抽出を行いたくなったときに、少しずつ発展的な記号を覚えていけば無理なく習得できます。今回の記事で紹介したメールアドレスの抽出や電話番号の判定などは、現実の処理で非常に多く使われるパターンで、実務にそのまま応用できる内容です。まずは簡単な検索から試し、徐々にパターンを増やしながら使い慣れていきましょう。
サンプルコード:検索・抽出・置換をまとめて試そう
import re
text = """
お問い合わせは info@example.com までお願いします。
電話番号は 090-1234-5678 です。
不要な情報を消して、必要な情報だけ抽出したいと考えています。
"""
# メールアドレスと電話番号を抽出
email_pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
phone_pattern = r"\d{2,4}-\d{2,4}-\d{4}"
emails = re.findall(email_pattern, text)
phones = re.findall(phone_pattern, text)
# 電話番号を非公開に置換
sanitized = re.sub(phone_pattern, "非公開", text)
print("メールアドレス一覧:", emails)
print("電話番号一覧:", phones)
print("置換結果:\\n", sanitized)
このサンプルコードでは、正規表現を使ったパターンマッチング、抽出、置換の一連の処理を体験できます。メールアドレスと電話番号をそれぞれ抽出するパターンを使い分け、さらにre.sub()で文字列の一部を置き換えています。実際の業務や日常のスクリプトでも同じような処理を行う機会は多く、この基礎を理解しておくと、より高度な加工処理にもスムーズに進めます。慣れてきたら、自分自身で異なるパターンを作り、さまざまな文字列に対して試してみることで、理解が深まり応用力も育っていきます。
生徒
「正規表現って難しいイメージがあったけど、基本だけならすごく使いやすいですね!数字を探したりメールアドレスを取り出したりできるのが面白かったです。」
先生
「基本パターンだけでも十分にいろいろな処理ができますよ。最初はよく使う記号を覚えて、慣れてきたら複雑なパターンにも挑戦していくと自然に身につきます。」
生徒
「re.search()やre.findall()も分かりやすかったです。検索と抽出の使い分けができると便利ですね。」
先生
「その通りです。文字列処理はPythonでよく使う場面が多いので、今回覚えた内容は必ず役に立ちます。まずは今回の記事を参考に、いろいろな文字列で試してみてください。」
生徒
「はい!自分でもパターンを作って試してみます!」