使い倒すための正規表現
~改行、エスケープ、否定、どんと来い!~

IT

記事は約 6 分で読めます。

くろやぎ
くろやぎ

みなさん、こんにちは!
くろやぎ(kuroyagikuncom)です。

覚えたようで覚えていない。それなのに使いたい場面がそれなりにある「正規表現」。

対象読者

「正規表現って、何?」という方
正規表現をぼんやりとしか理解できていない方
「今度こそ正規表現をマスターしてやる!」と思っている方

この記事を読むと、以下のことがわかるようになります。

内容

正規表現とは何か
正規表現を使う場面
正規表現の使い方

それでは、この記事で正規表現を使いこなせるようになりましょう!

実行環境

Windows10
Python3.6

正規表現とは何か

正規表現とは「文字列の中のパターンを表現する方法」のことです。
文字列の中のパターンを表現することで、複数の文字列を1つの文字列で表現することができるようになるんです。便利ですよね~
正規表現は通常の文字と「メタ文字」(特殊な役割を持つ記号)を組み合わせることによって構成されます。

例えば

という複数の文字列があった時に

といった具合に、所望の文字列だけを抽出することができます。

正規表現は知らなくても特に困ることはありませんが、知ってると作業を効率化でき、使いこなすことができると超時短術に成り得ます。

いつ使うのか?

僕が正規表現を実際に使ってみて便利だなと感じたのは、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個以下「?」

正規表現 マッチする文字列
ハイボール飲んでウィー? ハイボール飲んでウィー
ハイボール飲んでウィ

この正規表現は単数形複数形、スペースのあるなしを扱うときに役に立ちます。

単数形複数形

正規表現 マッチする文字列
Beatles? Beatle
Beatles

スペースのあるなし

正規表現 マッチする文字列
プエルト ?リコ プエルト リコ
プエルトリコ

任意の文字の繰り返し「.*」

今まで紹介してきた正規表現を組み合わせると、「任意の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歳になりました。
[]の中ではメタ文字は普通の文字として扱われます。

「[.*]」は「.か*いずれかの文字」という意味になります。

指定した文字以外「[^]」

正規表現 マッチする文字列
私は[^父]が好きだ。 私は母が好きだ。
私は弟が好きだ。
(世のお父さんごめんなさいw)

グループ化()

前述した、「直前の文字を1回以上繰り返し「+」」の例では

正規表現 マッチする文字列
ハイボール飲んでウィー+ ハイボール飲んでウィーーー

となっていましたが、グループ化すると

正規表現 マッチする文字列
ハイボール飲んで(ウィー)+ ハイボール飲んでウィーウィーウィー

というような文字列にマッチするようになります。

同様に、「いずれかの文字列「|」」において

正規表現 マッチする文字列
愛|金が大事
金が大事

グループ化すると

正規表現 マッチする文字列
(愛|金)が大事 愛が大事
金が大事

という風になります。

まとめ

いかがでしたか?
僕がよく使う正規表現を一気に紹介したので、一度に覚えるのには多すぎるかもしれません。
今すぐに使い倒せるようになる必要はないので、この記事を何度でも参照して、ゆっくりと使いながらマスターしていきましょう!

コメント

タイトルとURLをコピーしました