Pythonの正規表現:メタ文字とは何ぞや

正規表現から逃げちゃダメだ!!

ちゃんと勉強してなかった正規表現ですが、もしかしたら英語でドキュメント読んだら分かるかも!?と 思ってこちらの記事を読んでみました。そう、つまり私なりの要約です。

Regular Expression HOWTO — Python 3.6.4 documentation

正規表現の基本

  • 正規表現ってすごいシンプルな仕組みで、"test"で探したら"test"が引っかかるだけなの。
  • でもそれだと困る人がいるので、大文字小文字区別しないモード(case-insensitive)で実行すれば"Test"とか"TEST"が引っかかるわよ

メタ文字はX-MEN

  • ところが以下の文字は上記のルールに当てはまらない。文字というより役割を持っている
  • つまり元々平凡な高校生だったのに、秘められた力が開花して世界を救う羽目になったX-MENと思って取り扱って頂きたい

役割を持っている子達

. ^ $ * + ? { } [ ] \ | ( )

正規表現の箱を作る: [] (角括弧/Square Bracket)

この[] は正規表現の括りを作る為の箱の役割になる この中に入れる文字は、個別の文字を入れてもいいし、文字の範囲を入れてもいい

  • 個別の文字: [abc] => 'a', 'b', 'c'のどれか
  • 文字の範囲: [a-c] => 'a', 'b', 'c'のどれか
    • 小文字のみ: [a-z] => 'a'~'z'のどれか
    • 小文字大文字: [a-Z] => 'a'~'z', 'A'~'Z'のどれか

この箱に入るメタ文字は自分の役割(メタ)じゃなくて、元々の文字として扱われる(例外あり)

  • [abc$] => 'a', 'b', 'c', '$'のどれか

この箱に入るメタ文字で、元々の文字ではなく自分の役割を果たしてしまう子達

  • ^ (例外): [^5] => 5以外の文字

メタの役割を解除し元々の文字にする: \(逆斜線/バックスラッシュ)

バックスラッシュの前ではどのメタ文字も自分自身に戻らないといけないのだ!!

  • \[ => '['
  • \\ => '\'

文字の組み合わせを召喚してしまう: \ (逆斜線/バックスラッシュ)

文字と一緒になると文字の組み合わせを召喚出来る。 バックスラッシュの後に続く文字が大文字だと、それ以外、というルールが適応される。 多分大文字だと反抗期になっちゃうのね

  • \d == [0-9] => 0~9の数字のどれか
  • \D == [^0-9] => 0~9以外の文字
  • \s == [\t\n\r\f\v] => スペース文字のどれか
    • スペース文字とは?
  • \S == [^\t\n\r\f\v] ==> スペース文字以外の文字
  • \w == [a-zA-Z0-9_] ==> 英数字とアンダースコア(_)のどれか
  • \W == [^a-zA-Z0-9_] ==> 英数字とアンダースコア(_)以外の文字

上記の召喚文字と一緒に書かれた文字は特別扱いされない

  • [\s,.] == \s(スペース文字のどれか), ,, .のどれか

改行以外なら、なんでもOK: .

改行も入れたい場合、re.DOTALLモードにすれば全てを受け入れる神になれる

何度も何度も沈黙も含めて愛を叫びたい: *

直前にある文字を何度も繰り返すことが出来る。繰り返さなくてもいい。時には沈黙も愛の一つである。

  • ca*t == ctの間に a が0個から何個でも繰り返すことが出来る ==> ct, cat, caaat, caaaaaaaaaaaaaaaat
  • a[bcd]*b == abの間に b,c,dのどれかを何度も繰り返す
    • この処理についてはまた別途深く勉強せねば

何度も何度も最低一回以上は愛を叫びたい: +

直前にある文字を一回以上何度も繰り返すことが出来る

  • ca+t == ctの間に a を1回以上〜何個でも繰り返すことが出来る ==> cat, caaat, caaaaaaaaaaaaaaaat

沈黙もしくは1度だけ愛を叫びたい: ?

直前にある文字を、1回繰り返すか、もしくは繰り返さない、のどちらかが出来る

  • home-?brew == homebrewhome-brewのどちらかにマッチする

指定の回数だけ愛を叫びたい: {m,n}

m 回以上 n 回以下の回数の文字を繰り返す事が出来る

  • a/{1,3}b == a/ba//b か a///bのどれかにマッチする

どちらかの数字を省くことが出来るよ!

  • m を入れなかった場合、0回か0回以上になる
  • n を入れなかった場合、無制限(上限なし)になる

その他の動き

  • {0,}== 0回も含めて無制に愛を叫びたい == * と同じ
  • {1,}== 1回以上無限に愛を叫びたい == +と同じ
  • {0,1} == 0回か1回だけ愛を叫びたい == ?と同じ

明日は具体的な使い方を勉強したい