正規表現を使ったときにうまくいかないことがあったのでメモ
いつも正規表現を使っている方にはあたり前のことしか書いていないと思うので、生暖かく見守っていて下さい。
Mac上のPython3.6.2で動作確認しています。
環境によっては文字コードなどの違いで、再現できないかもしれません。
文字の範囲を指定するとき
テキストなどを見るとこのように書いてあったりします。
正規表現 | 意味 | |
---|---|---|
1 | [0-9] | 数字 |
2 | [A-Z] | アルファベット大文字 |
3 | [a-z] | アルファベット小文字 |
4 | [A-z] | アルファベット |
5 | [ぁ-ん] | ひらがな |
6 | [ァ-ヶ] | カタカナ |
7 | [ヲ-゚] | 半角カタカナ |
1. アルファベットにマッチさせる
純粋なアルファベット(A-Zとa-z)にマッチさせたいときに、安易にリストの4番目の [A-z]
を使おうとするとハマります。
アルファベットの文字コード
範囲を指定するときの、「範囲」とは文字コードの範囲なのですが、
[A-z]
の範囲の文字は
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, [, \\, ], ^, _, `, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z
の58文字です。
これをよく見ると大文字と小文字の間に、以下の6つの記号が含まれています[^1]。
[ \ ] ^ _ `
これを知らずに [A-z]
を使うと、アルファベット以外の文字にマッチしてしまうため、望んだ結果が得られません。
全角アルファベットのときも同様で、
[ \ ] ^ _ `
これら6つが含まれます。
純粋なアルファベットのみにマッチさせたい場合には、[A-Za-z]
という表現を使いましょう。
ちなみに、\w
というメタ文字(環境によっては¥w
)は [0-9A-Za-z_]
と同義であり、数字とアンダーバーが含まれているので、純粋アルファベットにマッチさせたい今回の場合は不適。
2. ひらがなやカタカナの濁音・半濁音にマッチさせたいとき
例えば "か" 行の濁音にマッチさせたいというときに、安易に [が-ご]
を使おうとするとハマります。
ひらがなの文字コード
ひらがなを文字コード順に並べると以下のようになります。
ぁ, あ, ぃ, い, ぅ, う, ぇ, え, ぉ, お, か, が, き, ぎ, く, ぐ, け, げ, こ, ご, さ, ざ, し, じ, す, ず, せ, ぜ, そ, ぞ, た, だ, ち, ぢ, っ, つ, づ, て, で, と, ど, な, に, ぬ, ね, の, は, ば, ぱ, ひ, び, ぴ, ふ, ぶ, ぷ, へ, べ, ぺ, ほ, ぼ, ぽ, ま, み, む, め, も, ゃ, や, ゅ, ゆ, ょ, よ, ら, り, る, れ, ろ, ゎ, わ, ゐ, ゑ, を, ん
よく見ると、か, が
のように かな, 濁音かな
の順に並んでいることがわかります。
上に書いた [が-ご]
という正規表現では途中のき, く, け, こ
という余計な文字を含んでしまうのです。
他の ざ, だ, ば, ぱ 行も同様です。
また、[ゃ-ょ]
と小文字にマッチさせたいときもこれが起こります。
当初の目的である、"か" 行の濁音にマッチをさせるには、一つずつ実直に [がぎぐげご]
と書いていくのがいいと思います。
何か他にいい方法を知っている方がいましたら教えてください。
3. カタカナにマッチさせたいとき
カタカナのみで構成された単語にマッチさせたいとき、安易に上のリストの6番目 [ァ-ヶ]
を使おうとするとハマります。
カタカナの文字コード
ひらがなを文字コード順に並べると以下のようになります。
ァ, ア, ィ, イ, ゥ, ウ, ェ, エ, ォ, オ, カ, ガ, キ, ギ, ク, グ, ケ, ゲ, コ, ゴ, サ, ザ, シ, ジ, ス, ズ, セ, ゼ, ソ, ゾ, タ, ダ, チ, ヂ, ッ, ツ, ヅ, テ, デ, ト, ド, ナ, ニ, ヌ, ネ, ノ, ハ, バ, パ, ヒ, ビ, ピ, フ, ブ, プ, ヘ, ベ, ペ, ホ, ボ, ポ, マ, ミ, ム, メ, モ, ャ, ヤ, ュ, ユ, ョ, ヨ, ラ, リ, ル, レ, ロ, ヮ, ワ, ヰ, ヱ, ヲ, ン, ヴ, ヵ, ヶ
これの最後にある ヵ, ヶ
という文字が重要。
これは、「1ヶ月」や「2ヵ所」など、助数詞として使われたり、「八ヶ岳」のように連体助詞「が」の代わりに使われたりするカタカナです。
ヵ, ヶ
のような文字を含めてしまうことで上のような言葉に含まれるカタカナにマッチしてしまい、カタカナのみで構成される単語ではなくなってしまいます。
マッチさせたくない場合は、[ァ-ヴ]
とすることで、上の2つのカタカナを除きましょう。
[ぁ-ん]
のひらがなとは違い、カタカナの場合は [ァ-ヴ]
です!
その他カタカナには ヰ, ヱ
も含まれるので、取り除きたかったら文字コードの順番を見ながら書き換えて下さい。
まとめ
以上、正規表現を使う際に注意すべき点を紹介してきました。
正規表現の範囲指定では、文字コードの順番がそのまま使われるので、文字コードを見て確認しながら書くことが大切です。