覚えたようで覚えていない。使いこなせるようになったつもりでも、時間が経って使おうと思ったときに使い方をなかなか思い出せない「正規表現」。今回は、正規表現をまだ使ったことがない方や正規表現をいまいち使いこなせていないという方を対象に、正規表現の概要からよく使う表現のまとめまで、わかりやすく解説していきます。
- 「正規表現って、何?」という方
- 正規表現をぼんやりとしか理解できていない方
- 「今度こそ正規表現をマスターしてやる!」と思っている方
- 正規表現とは何か
- 正規表現を使う場面
- 正規表現の使い方
- Windows 10
- Python3.6
では、この記事を読んで正規表現を使いこなせるようになりましょう!
正規表現とは何か
正規表現とは「文字列の中のパターンを表現する方法」のことです。文字列の中のパターンを表現することで、複数の文字列を1つの文字列で表現することができるようになるんです。文字列を抽象化して表現することでいちいち具体的な文字列を処理する必要がなくなるので、文字列に対して一括処理を行いたいときなんかには便利。
正規表現は通常の文字と「メタ文字」(特殊な役割を持つ記号)を組み合わせることによって構成されます。
例えば、次のような複数の文字列に対して特定の文字列を検索したい場合を考えてみましょう。
くろやぎくん.com kuroyagikun.com くろやぎくん.jp 123.com
「く」で始まる文字列である「くろやぎくん.com」と「くろやぎくん.jp」にマッチさせたい場合は、次のような表現。
^く.*
また、「○○(数値).com」と書かれた文字列である「123.com」にマッチさせたい場合は、次のような表現。
[0-9]+.com
このように、正規表現を使用することで所望の文字列だけを抽出することができます。正規表現は知らなくても特に困ることはありませんが、知っていると作業を効率化でき、使いこなすことができると超時短術に成り得る優れものです。
いつ使うのか?
僕が正規表現を実際に使ってみて便利だなと感じたのは、Wordで文章編集しているとき。「同じような形式の文字列を置換したいな~」なんて時に役立ちます。
また、HTMLの編集をしているときに、「あのクラス名を持つタグだけを削除したい」という場面でも大活躍しました。ウェブ関係の仕事をしている方は使う場面が多そうです。
正規表現のメタ文字
正規表現で使うメタ文字
正規表現で使うメタ文字は次の通り。
. ^ $ [ ] * + ? | ( )
すべて半角記号であることに注意です!
でも、この記号って普通の文章でもよく使いますよね?例えば、「https://www.google.co.jp/search?q=google」の中に含まれる「.」や「?」みたいに。なので、正規表現を用いた検索を行う場合、この文字列を検索するときに「https://www.google.co.jp/search?q=google」と検索してもマッチしません。なぜならば、「?」などの文字がメタ文字として扱われてしまっているから。
では、普通の文字として扱うにはどうすればいいか。それは、次の通りメタ文字の直前に\(バックスラッシュ)をつけます。
\. \^ \$ \[ \] \* \+ \? \| \( \) \\
「通常の文字として使いますよ~」とコンピュータに知らせる役割を、「\」が担っているのです。
メタ文字の種類
先ほどメタ文字をいくつか紹介しましたが、それらの持つ意味を見ていきましょう。
ちなみにですが、メタファーは隠喩という意味で、文字そのままの意味ではなく、何かに例えることで非明示的に表現することです。
任意の1文字「.」
正規表現 | マッチする文字列 |
---|---|
くろやぎくんは.が好き。 | くろやぎくんは黒が好き。 くろやぎくんは猫が好き。 |
「.(ドット)」として扱いたい場合は、次のようにバックスラッシュを直前に置きます。
正規表現 | マッチする文字列 |
---|---|
test\.txt | test.txt |
行頭「^」
正規表現 | マッチする文字列 |
---|---|
^よろし | よろしく! よろしくお願いします よろしゅうござんす |
行末「$」
正規表現 | マッチする文字列 |
---|---|
ます$ | ありがとうございます にじます |
直前の文字を0回以上繰り返し「*」
正規表現 | マッチする文字列 |
---|---|
ハイボール飲んでウィー* | ハイボール飲んでウィ ハイボール飲んでウィー ハイボール飲んでウィーーー |
直前の文字を1回以上繰り返し「+」
正規表現 | マッチする文字列 |
---|---|
ハイボール飲んでウィー+ | ハイボール飲んでウィー ハイボール飲んでウィーーー |
直前の文字を1回以下繰り返し「?」
正規表現 | マッチする文字列 |
---|---|
ハイボール飲んでウィー? | ハイボール飲んでウィー ハイボール飲んでウィ |
「直前の文字を1回以下繰り返し」とややこしい漢字で書いてありますが、要するに「直前の文字を0回または1回繰り返し」ということです。この正規表現は英単語の単数形と複数形やスペースのあるなしなどを扱うときに役に立ちます。
単数形複数形
正規表現 | マッチする文字列 |
---|---|
Beatles? | Beatle Beatles |
スペースのあるなし
正規表現 | マッチする文字列 |
---|---|
プエルト ?リコ | プエルト リコ プエルトリコ |
任意の文字の繰り返し「.*」
ここまで、1つのメタ文字で表される正規表現について見てきましたが、これらを組み合わせると、「任意の1文字を0回以上繰り返す」などの表現可能になります。
正規表現 | マッチする文字列 |
---|---|
.*たい。 | たくさんの人にブログを見てもらいたい。 ガジェット好きの人とつながりたい。 |
この「.*」を使うときには、その適用範囲に注意が必要です。
「隣の客はよく柿食う客だ。」という文字列を例にして考えてみましょう。
正規表現 | マッチする文字列 |
---|---|
隣.*客 | ×隣の客 〇隣の客はよく柿食う客 |
この例を見てわかるように、「.*」はできるだけ長くパターンに合うものとマッチします。したがって、文末を「.*」とすることで、文末まで合致するといった応用的な使い方もできるようになります。
直前の文字をn回繰り返す「{n}」
正規表現 | マッチする文字列 |
---|---|
[0-9]{3}-[0-9]{4}-[0-9]{4} | 090-1234-5678 |
この正規表現は、電話番号や郵便番号の抽出に役立ちますね。
いずれかの文字列「|」
正規表現 | マッチする文字列 |
---|---|
くろやぎ|しろやぎ|あおやぎ|あかやぎ | くろやぎ しろやぎ あおやぎ あかやぎ |
指定した文字の中のいずれかの文字や数字「[a-z]や[0-9]」
正規表現 | マッチする文字列 |
---|---|
[f-h]ound | found gound hound |
正規表現 | マッチする文字列 |
---|---|
1[0-9]歳になりました。 | 10歳になりました。 12歳になりました。 15歳になりました。 18歳になりました。 |
指定した文字以外「[^]」
正規表現 | マッチする文字列 |
---|---|
私は[^父]が好きだ。 | 私は母が好きだ。 私は弟が好きだ。 |
世のお父さん、悪気はないので悪しからず。
グループ化()
前述した、「直前の文字を1回以上繰り返し「+」」の例においては、以下のようなマッチング結果になりました。
正規表現 | マッチする文字列 |
---|---|
ハイボール飲んでウィー+ | ハイボール飲んでウィーーー |
しかし、グループ化を用いることで以下のような文字列にマッチするようになります。
正規表現 | マッチする文字列 |
---|---|
ハイボール飲んで(ウィー)+ | ハイボール飲んでウィーウィーウィー |
同様に、「いずれかの文字列「|」」の例も見てみましょう。
正規表現 | マッチする文字列 |
---|---|
愛|金が大事 | 愛 金が大事 |
ここで、グループ化すると以下のようになります。
正規表現 | マッチする文字列 |
---|---|
(愛|金)が大事 | 愛が大事 金が大事 |
まとめ
今回は、はじめに正規表現の概要について少し触れ、よく使う表現をまとめて紹介しました。僕がよく使う正規表現を一気に紹介したので、もしかすると、一度に覚えるのには多すぎるかもしれません。今すぐに使いこなせるようになる必要はないので、この記事を何度も参照して、ゆっくりと使いながらマスターしていきましょう!