pythonでひらがな、カタカナ判定をする

一覧をリストにしてinで比較してもいいんだけど、もうちょっとスマートにやりたい。
ユニコードとかアスキーとかをちゃんと勉強した人にとっては多分当たり前のことなんだと思う。

ひらがなの「も」
カタカナの「モ」

を判別する時、以下のように書くことが可能。

>>> 'あ'<='も'<~'ん'
True
>>> 'ア'<='モ'<='ン'
True

#こちらはもちろんFalse
>>> 'あ'<='モ'<='ん'
True
>>> 'ア'<='も'<='ン'
True

これなら簡単だが、実は「ぁ」などを判別できない

>>> 'あ'<='ぁ'<='ん'
False

ordとchrをつかって、ひらがなの範囲を調べてみる。

#'ぁ'は'あ'の一つ前
>>> ord('ぁ')
12353
>>> ord('あ')
12354

#'ぁ'より前にひらがなはない
>>> chr(ord('ぁ')-1)
'\u3040'
>>> chr(ord('ぁ')-2)
'〿'
>>> chr(ord('ぁ')-3)
'〾'

#'ん'以降を調べる
>>> chr(ord('ん')+1)
'ゔ'
>>> chr(ord('ん')+2)
'ゕ'
>>> chr(ord('ん')+3)
'ゖ'
>>> chr(ord('ん')+4)
'\u3097'
>>> chr(ord('ん')+5)
'\u3098'
>>> chr(ord('ん')+6)
' ゙'
>>> chr(ord('ん')+7)
' ゚'
>>> chr(ord('ん')+8)
'゛'
>>> chr(ord('ん')+9)
'゜'
>>> chr(ord('ん')+10)
'ゝ'
>>> chr(ord('ん')+11)
'ゞ'
>>> chr(ord('ん')+12)
'ゟ'
>>> chr(ord('ん')+13)
'゠'   	#ここからカタカナになる
>>> chr(ord('ん')+14)
'ァ'	

ひらがなは実用的には「ゖ」が最後、ちゃんと全部取りたいなら「ゟ」まで取れば良さそう。
(「ゟ」は「より」と読むらしい。初めて知った。)



同様にして、カタカナの範囲も調べる。
'゠'はダブルハイフンといって、外国人名などで使われるやつ。
(バスコ゠ダ゠ガマみたいなやつ)

#カタカナの始まりを調べる
>>> chr(ord('ア'))
'ア'
>>> chr(ord('ア')-1)
'ァ' 
>>> chr(ord('ア')-2)
'゠'                        #ここから
>>> chr(ord('ん')-3)
'ゟ'

#カタカナの終わりを調べる
>>> chr(ord('ン')+1)
'ヴ'
>>> chr(ord('ン')+2)
'ヵ'
>>> chr(ord('ン')+3)
'ヶ'
>>> chr(ord('ン')+4)
'ヷ'
>>> chr(ord('ン')+5)
'ヸ'
>>> chr(ord('ン')+6)
'ヹ'
>>> chr(ord('ン')+6)
'ヹ'
>>> chr(ord('ン')+7)
'ヺ'
>>> chr(ord('ン')+8)
'・'
>>> chr(ord('ン')+9)
'ー'
>>> chr(ord('ン')+10)
'ヽ'
>>> chr(ord('ン')+11)
'ヾ'
>>> chr(ord('ン')+12)
'ヿ'                    #ここまで
>>> chr(ord('ン')+13)
'\u3100'

こちらも、実用レベルなら「ヶ」が最後、伸ばし棒や中黒をカタカナとして判定したい、などなら「ヿ」までをカタカナにすればいい。
(「ヿ」はコトと読む合字)


ちなみに半角のカタカナは以下の通り。

# 半角カタカナの始まりを調べる
>>> chr(ord('ア')-1)
'ー'
>>> chr(ord('ア')-2)
'ッ'
>>> chr(ord('ア')-3)
'ョ'
>>> chr(ord('ア')-4)
'ュ'

...

>>> chr(ord('ア')-14)
'」'
>>> chr(ord('ア')-15)
'「'
>>> chr(ord('ア')-16)
'。'					#半角カタカナの始め(多分)
>>> chr(ord('ア')-17)
'⦆'


# 半角カタカナの終わりを調べる
>>> chr(ord('ン')+1)
'゙'
>>> chr(ord('ン')+2)
'゚'					#半角カタカナの終わり
>>> chr(ord('ン')+3)
'ᅠ'
>>> chr(ord('ン')+4)
'ᄀ'					#ここからはハングル
>>> chr(ord('ン')+5)r
'ᄁ'
>>> chr(ord('ン')+6)
'ᆪ'

半角用の句読点とか、長音記号とか、いろいろあってびっくりした。
「ᄀ」は「ヿ」の半角かと思ったら普通にハングルだった。難しい。


以上を踏まえて、判定するプログラムは以下の通り。

>>> def judge(c):
...    if 'ぁ' <= c <= 'ゟ':
...        print('ひらがな!')
...    elif '゠' <= c <= 'ヿ':
...        print('カタカナ!')
...    elif '。' <= c <= '゚':
...        print('カタカナ!')