python文字列|半角/全角混じりの文字数カウントにはeast_asian_width()

Pythonで半角と全角が入り混じった文字列を数える方法があります。半角を1文字・全角を2文字分としてカウントするには、unicodedataモジュールのeast_asian_width関数を使うと便利です。

文字列を半角として数える関数

半角と全角が入り混じったテキストの文字列を半角として数えて返す関数です。

import unicodedata as uni

def len_halfwidth(text):
    return sum([(1, 2)[uni.east_asian_width(t) in 'FWA'] for t in text])


##関数を使ってみると...
len_halfwidth('abcあいう')
# 9

※east_asian_widthの返り値を(半角=1文字, 全角=2文字)としてリストします。その合計値が半角として数えた文字数です。

文字列を全角として数える関数

半角と全角が入り混じったテキストの文字列を全角として数えて返す関数です。

import unicodedata as uni

def len_fullwidth(text):
    return -(-sum([(1, 2)[uni.east_asian_width(t) in 'FWA'] for t in text])//2)


##関数を使ってみると...
len_fullwidth('abcあいう')
# 6

※east_asian_widthの返り値を(半角=1文字, 全角=2文字)としてリストします。その合計値を2で割ったのが全角として数えた文字数です。半端の半角は全角1文字分として数えます。

unicodedata.east_asian_width()の使い方

unicodedataモジュールは、Pythonの標準モジュールです。importして使用します。east_asian_width()はunicodedataモジュールに入っている関数です。east_asian_widthの返り値は6つに分類されます。

返り値 特性
F(Fullwidth) 全角英数
H(Halfwidth) 半角カナ
W(Width) 仮名・漢字・句読点など
Na(Narrow) 半角英数
A(Ambiguous) その他全角文字(ギリシャ文字など)
N(Neutral) その他(全角でも半角でもない)

文字数のカウントは、文字列を一文字づつeast_asian_width関数で判定します。判定の返り値が’F’, ‘W’, ‘A’のときは全角です。これ以外の返り値は半角です。