Python3.xの文字列はUNICODEのコードポイントの値の並び(シーケンス)ですので、判定はコードポイントがどの範囲内にあるか比較するだけです。
漢字について、中国・日本・韓国の頭文字をとってCJK
と言います。UNICODEではCJKの漢字を統合して扱っています(unified ideographs)。もっともよく使われるものは0x4e00~0x9fffに収録されているようです。
http://jrgraphix.net/r/Unicode/4E00-9FFF
漢字には出現頻度の低いものを別に用意してるので、これらも含めるべきか検討してみてください。
CJK Unified Ideographs Extension A
CJK Unified Ideographs Extension B
(略)
同様にひらがなは以下の範囲にあります。
http://jrgraphix.net/r/Unicode/3040-309F
数字やカタカナもあるので調べてみてください。
(半角の数字ならstringモジュールが使えるかもしれません)
文字とコードポイント値の変換は組み込み関数のord
とchr
を使います。
>>> ord('あ')
12354
>>> chr(12354)
'あ'
>>> chr(0x3042)
'あ'
あとはその範囲内にあるかどうかチェックする関数を作って、文字(コードポイント)ごとに判定すればいいだけです。
import sys
is_hiragana = lambda code: 0x3040 <= ord(code) <= 0x309f
is_cjk_kanji = lambda code: 0x4e00 <= ord(code) <= 0x9fff
num_hiragana, num_kanji = 0, 0
for line in sys.stdin:
num_hiragana += sum(1 for _ in filter(is_hiragana, line))
num_kanji += sum(1 for _ in filter(is_cjk_kanji, line))
print('漢字の数: {}'.format(num_kanji))
print('ひらがなの数: {}'.format(num_hiragana))
UNICODEコードポイントの1次情報源はこちらです。
===
質問についての追記(コメント欄ではマークダウン記法ができないので…)。
例に挙げてくださった,’あ’の変換は理解できるのですが,実際にテキストファイル内の文字をコードポイントへ変換する場合はどうしたらよいのでしょうか.
forとかで回せば1文字ずつ取得できますよ。
s = 'あいうえお'
for letter in s:
print(letter, ord(letter))
$ python a.py
あ 12354
い 12356
う 12358
え 12360
お 12362
テキストファイルから読み込む場合は、使われるエンコーディングがプラットフォーム依存なのでencoding=
で指定しておいたほうが良いです。
with open('some_text_file', encoding='utf-8') as f:
for line in f:
for letter in line:
print(letter, ord(letter))
$ python b.py
今 20170
日 26085
は 12399
暑 26257
い 12356
! 65281
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/08/03 17:29
2015/08/03 21:10 編集
退会済みユーザー
2015/08/07 04:17