- ベストアンサー
python正規表現で全角カタカナの色名にマッチしない濁音の問題
- pythonの正規表現を使用して、全角カタカナの色名にマッチするパターンを作成しています。
- しかし、濁音のカタカナにマッチしない問題が発生しています。
- 正規表現のパターンを見直して、濁音のカタカナにもマッチするよう修正する必要があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
http://okwave.jp/qa/q7612841.html でも書いたのですが、2.xでは、strとunicodeの2種類の文字列があります。 日本語の場合 str: 1文字が複数バイトの文字として扱われます。 unicode: 1文字が1文字として扱われます。 検索パターンをreprで比べると strでは '[\xe3\x82\xa1-\xe3\x83\xb4\xe3\x83\xbc\xc3\x97]+\\([A-Z/]+\\)|\xe3\x82\xab\xe3\x83\xa9\xe3\x83\xbc\xe3\x81\xaa\xe3\x81\x97' (UTF-8の場合) unicodeでは u'[\u30a1-\u30f4\u30fc\xd7]+\\([A-Z/]+\\)|\u30ab\u30e9\u30fc\u306a\u3057' とまったく違うのがわかります。 strでは 「ァ」 は \xe3\x82\xa1 と3文字であり、 「ァ-ヴ」 とやっているつもりで、 実際は「\xa1-\xe3」になっています。 unicodeでは \u30a1 と一文字扱いされています。 検索される側の文字列も同様です。 strでは ベリー が \xe3\x83\x99\xe3\x83\xaa\xe3\x83\xbc となります。 \x99は上の[]内の文字に一致するものはありあせん。パターンに一致するのは \xe3\x83\xaa\xe3\x83\xbc となり、これをUTF-8で解釈すれば リーになります。 また、 \xe3\x83\x99 は unicodeの「ベ」ではないので、パターンだけunicodeにしてもマッチしません。 一般に、日本語を使った正規表現が期待通りに動くのは、パターン、対象文字列ともにunicode文字列のときだけです。 他の言語やツールでも、日本語に対応した方法を使わないと、同様の現象が発生します。