文字列

【Python】文字列の長さ(文字数・文字幅)を取得する方法

【Python】文字列の長さ(文字数・文字幅)を取得する方法

Pythonで文字列の長さ(文字数・文字幅)を取得する方法についての解説します。

文字列の長さを取得する

Pythonで文字列の長さを取得する方法について説明します。「文字列の長さ」と一言で言っても、文字数と文字幅という観点があります。

文字数というのは言葉の通り文字の数のことで、半角文字/全角文字に限らず1文字とカウントしたもののことです。一方で、文字幅は全角は2文字、半角は1文字としてカウントしたものです。

Pythonで文字数を取得するにはlen、文字幅を取得する場合には、unicodedata.east_asian_widthが使用できます。本記事では、それぞれの使い方について紹介します。

lenで文字列の文字数を取得する

Python組み込みのlenを使用することで、引数に指定したオブジェクトの長さや要素の数を取得することができます。引数としてはシーケンス (文字列、バイト列、tuple、list、range等) かコレクション (dict、set、frozenset等) を指定できますので、文字列に限った関数ではありません。

引数に文字列を指定した場合には、文字列の長さを取得することができます。ここで長さと言っているのは文字数の事です。lenで文字列の文字数は取得するには以下のようにします。

# 文字列の文字数を取得する
temp_text = "Python文字列入門"
print(f"文字列の文字数:{len(temp_text)}")
【実行結果】
文字列の文字数:11

lenに対象の文字列を渡すだけなので非常に簡単です。上記の結果を見てもわかるようにバイト数ではなく文字数を取得します。マルチバイト文字である日本語に関しても正しく1文字としてカウントできていることが分かります。

unicodedata.east_asian_widthで文字幅を取得する

Pythonで文字列の文字幅を取得したい場合には、unicodedata.east_asian_widthが使用できます。

East Asian Width (東アジアの文字幅)とは、Unicode標準の付属書11(UAX#11)でUnicode各文字の文字幅に関するヒントとなる特性を割り当てたものです。その種類としては以下のようなものがあります。

区分種類内容
全角F全角英数等(Full width)
全角W漢字や全角かな等(Wide)
全角A特殊文字(Ambiguous)
半角Na半角英数等(Narrow)
半角H半角カタカナ等(Half width)
半角Nアラビア文字などのその他(Neutral)

unicodedata.east_asian_widthは、引数に指定した文字に対する上記の種類を返却してくれるため、その種類によってF, W, Aは全角(2文字分)、NA, H, Nは半角(1文字分)として考えることで文字幅を計算することができます。

unicodedata.east_asian_widthで文字幅を取得する例は以下のようになります。

import unicodedata

# 文字列の文字幅を取得する
temp_text = "Python(パイソン)文字列入門2021年☆"
length = 0
for ch in temp_text:
    print(f"ch: {ch}, return:{unicodedata.east_asian_width(ch)}")
    # 種類によってlengthを加算する
    if unicodedata.east_asian_width(ch) in "FWA":
        length += 2
    else:
        length += 1
print(f"文字列の文字幅:{length}")
【実行結果】
ch: P, return:Na
ch: y, return:Na
ch: t, return:Na
ch: h, return:Na
ch: o, return:Na
ch: n, return:Na
ch: (, return:Na
ch: ハ, return:H
ch: ゚, return:H
ch: イ, return:H
ch: ソ, return:H
ch: ン, return:H
ch: ), return:Na
ch: 文, return:W
ch: 字, return:W
ch: 列, return:W
ch: 入, return:W
ch: 門, return:W
ch: 2, return:F
ch: 0, return:F
ch: 2, return:F
ch: 1, return:F
ch: 年, return:W
ch: ☆, return:A
文字列の文字幅:35

上記のプログラムでは、対象文字列から一文字ずつfor文で取得し、east_asian_widthに渡した際の返却値が”FWA”に含まれるかをinで判定しています。

そして、”FWA”に含まれる(=全角)であればlengthを+2、その他(=半角)であればlengthを+1することで文字幅を計算しています。east_asian_widthの返却値もあわせて出力してみていますが、半角や全角を表す種類が返却値として取得できていることが分かります。

このように文字幅を求めたいのかのeast_asian_widthを使いましょう。

まとめ

Pythonで文字列の長さ(文字数・文字幅)を取得する方法についての解説しました。

文字数を取得するにはlen、文字幅を取得する場合には、unicodedata.east_asian_widthが使用できます。

プログラミングの場面によって文字数を取得したいのか、文字幅を取得したいのかが変わってくるかと思いますので、うまく使い分けるようにしましょう。

Note

len関数の公式ドキュメントはこちらを参照してください。
unicodedata.east_asian_widthの公式ドキュメントはこちらを参照してください。