unicodeエスケープされた文字列を正規表現抽出するとき悩んだ話

死ぬほどめんどくさいunicode問題ですが、イマイチ理解ができないままです。ですがなんとなく抽出できたので書き置きます。

スポンサーリンク

ぶち当たった壁

プログラム

Webなんかのスクレイピングをしているときに、取得したテキストやらをみてみると、何やら何やら感やらで表現された文字列が並んでいる…printすればなんか普通っぽく表示されるのに…ちなみに環境はpython 2.7系です。

案の定、普通に正規表現使ってピックアップしようとしてもニントモカントモ。unicodeエスケープってやつですか?これでは文字列を正規表現使ってピックアップしたくてもうまくいかない…

正規表現がうまくいっていない?

正規表現自体はここをみて、恐らくは正しいはず…

正規表現オンラインテストサイトなるものがあるので、文字列と正規表現を入れてみてテスト…うまくいった!

Regular Expression Test Drive

ならば尚更なぜ!?文字コードが変だからかなー。

unicodeエスケープされた文字列を変換できないものか

\u3042のように\uと4桁の16 進数からなるUnicodeエスケープシーケンスを含む文字列・バイト列を相互に変換する方法を説明する。Python3の場合について、以下の内容を説明する。文字列をUnicodeエスケープされたバイト列に変換(エンコード) Unicodeエスケープされたバイト列を文字列に変換(デコード...

ここに詳しく書いてございました。encodeしたりdecodeしたり…が、うまくいかず。なんやねん。普通に動くのに、encodeされてるの?

じゃぁ、unicodeエスケープされたまま正規表現で引っかければいいじゃない

「Unicode Escape Sequence」なるサイトで、日本語文字列をunicodeに変換して…

できた!コードはこんな感じ。

re.match(u'(.*)(?=[\u3000])’, target_string)

引っ掛けたい文字列をエスケープされた文字列で書くんですが、クォーテーションの前にunicodeを指定する「u」を入れるみたい。

まとめ

いやー正直文字列コードの内容は全然理解できてないんですが、無理くりにでもなんとか正規表現にかけることができるようになりました。python3.0系にするとこんなこと悩まないのかなー。