郵便番号の形を一行で書く
正規表現とは、文字列の形をパターンで表す書き方です。入力欄での郵便番号や電話番号のチェックのように、決まった形の文字列を探すときに使います。
郵便番号は、数字3つ、ハイフン、数字4つの形です。この形を一行で書けば、grep コマンドが、合う行だけを取り出してくれます。
このレッスンのゴール
メモ
正規表現を書いて、grep -E で合う文字列を取り出せる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| 正規表現 | 文字列の形を表す、パターンの書き方 | |
| 文字クラス | 角かっこの中の、どれか1文字に合う部品 | [0-9] |
| 繰り返し | 直前の部品が何回続くかを表す印 | {3} |
| 選択 | 2つのうち、どちらかに合う書き方 | cat|dog |
| アンカー | 行の先頭や末尾に合う印 | ^ と $ |
| grep | パターンに合う行だけを出すコマンド |
学生が入力するセルは、このプレビューでは空白です。
小さな部品を並べて作る
正規表現は、小さな部品を並べて作ります。ふつうの文字は、その文字自身に合います。. はどんな1文字にも合い、[0-9] は数字1文字に合います。
{3} は直前の部品が3回です。+ は1回以上、? は0回か1回、* は0回以上を表します。
正規表現の部品
| 書き方 | 意味 | 合う例 |
|---|---|---|
| c.t | c と t の間に何か1文字 | cat, cut |
| [0-9] | 数字1文字 | 7 |
| [0-9]{3} | 数字がちょうど3つ | 100 |
| ab+ | a のあとに b が1つ以上 | ab, abbb |
| colou?r | u は0回か1回 | color, colour |
| ^[0-9]+$ | 行全体が数字だけ | 2026 |
学生が入力するセルは、このプレビューでは空白です。
Python でも同じ書き方
import re
# 社員番号: 英大文字1つと、数字4つ。
pattern = "[A-Z][0-9]{4}"
for text in ["A1234", "a1234", "A123", "B99999"]:
print(text, bool(re.fullmatch(pattern, text)))
# pattern を "[A-Z][0-9]{3,4}" に変えて、もう一度実行しましょう。
grep -E でパターンを試す
grep -E は、パターンに合う行だけを出力します。printf で何行かの文字列を作り、| でつなげば、小さな実験ができます。
^ は行の先頭、$ は行の末尾です。両方を付けると、行全体がパターンに合うときだけ出力されます。
郵便番号の形を探す
printf '100-0001\n1000001\n12-3456\n' | grep -E '^[0-9]{3}-[0-9]{4}$'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
真ん中は何でもよい
printf 'cat\ncot\ncut\nct\n' | grep -E '^c.t$'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
0回か1回の u
printf 'color\ncolour\ncolr\n' | grep -E '^colou?r$'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
選択に合う行を数える
printf 'cat\ndog\ncats\nbird\n' | grep -E -c '^(cat|dog)s?$'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
^ と $ を付けないと一部に合う
(cat|dog)s? は「cat か dog、そのあとに s が0回か1回」です。-c は、合った行の数を出します。
次の Run では、同じパターンから ^ と $ を外します。余分な文字を含む行まで、出力されます。
アンカーを付けない
printf '100-0001\nA100-00012\n' | grep -E '[0-9]{3}-[0-9]{4}'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
grep は行全体を調べる、と思いがちです。実際は、行の一部に合えば、その行を出力します。行全体を調べたいときは、^ と $ で両側を縛ります。入力チェックに使うなら、必ず付けます。
正規表現は数えられない
正規表現は、有限オートマトンと同じ力しか持ちません。覚えられるのは、限られた状態だけです。
だから、開き括弧と閉じ括弧が同じ数かどうかは、確かめられません。次の Run のパターンは「( がいくつか、そのあと ) がいくつか」という形だけを見ます。
括弧の数は比べられない
printf '(())\n(()\n()()\n' | grep -E '^\(+\)+$'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
さらに挑戦: 電話番号
日本の電話番号の形を、正規表現で書いてみましょう。市外局番の0から始まり、数字が1〜3つ、ハイフン、数字が2〜4つ、ハイフン、数字が4つです。
printf で正しい番号と間違った番号を何行か作り、grep -E に渡して、正しいものだけが出ることを確かめましょう。