電子書籍の厳選無料作品が豊富!

下記のような正規表現で「全角カタカナの色名(アルファベットの色名)」で書かれている文字にマッチするものを作りたいのですが、カタカナの濁音にマッチしてくれません。
iro=re.compile("[ァ-ヴー×]+\([A-Z/]+\)|カラーなし")


ベリー(BERRY)/ ブラック(BK)/ ブルー(BL)/ フォレスト(FOST)/ グリーン(GN)/ グレー(GY)/ ピンク(PK)/ パープル(PU)/ タンジェリン(TGR)



リー(BERRY)ラック(BK)ブルー(BL)グリーン(GN)グレー(GY)ンク(PK)ープル(PU)タンジェリン(TGR)

このように中途半端にパブべが除かれてマッチします。いったいどういうことなんでしょうか?

A 回答 (1件)

http://oshiete.goo.ne.jp/qa/7612841.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文字列のときだけです。

他の言語やツールでも、日本語に対応した方法を使わないと、同様の現象が発生します。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!