verbalize

文章書く練習…。

Pythonの日本語文字列

研究者流コーディングの極意」を読んで、なんだかためになりそうだし、面白そうだし、ということで言語処理100本ノックを始めてみました。そして2つ目で詰まった(早い)。
使っている言語はPythonで、使い始めたばかりなのですが、そもそもプログラミングがダメダメです。

まず、その問題ですが、

01. 「パタトクカシーー」
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

です。

まず私が考えたのは、こんな感じです。なんの疑問もなくこれでいけるだろうと思ってました笑。

string="パタトクカシーー"
rev=""
for i in [1,3,5,7]:
    rev+=string[i]
print rev

一方結果は、

% python 01.「パタトクカシーー」.py
�㿃

なんか文字化けしてる…。
それもそのはずで、「パタトクカシーー」は全て全角文字なのでひとひねり必要です。一般に半角は1byte、全角は2byteに符号化されているので、配列のお部屋と1:1対応にならないのが原因。
そしてPythonの場合、通常のstr型の全角文字は3byteに符号化されている(お部屋3つに対応している)みたいです。

>>> 'あ'[0]
'\xe3'
>>> 'あ'[1]
'\x81'
>>> 'あ'[2]
'\x82'
>>> 'あ'[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

この記事が参考になりました。qiita.com

これを知ったうえで愚直に書き換えると、

string="パタトクカシーー"
rev=""
for i in [1,3,5,7]:
    for j in range(3):#全角なので
        rev+=string[3*i+j]
print rev
% python 01.「パタトクカシーー」.py
タクシー

うまくいったー!!

また、Pythonには全角文字でもお部屋と1:1対応してくれる便利な型があります。「ユニコード文字列」です。

string=u"パタトクカシーー"
rev=""
for i in [1,3,5,7]:
    rev+=string[i]
print rev

これでもできます。便利。
超基礎的な文字列処理ですが、Pythonで鍛え直します…。