このページでは、Pythonで文字列の長さを調べる方法を解説していきます。
まず、普通に調べるにはlen関数を使います。しかし、Python 2 と Python 3 で文字列の扱いが大きく異なるため、文字数カウントのされ方に違いがあります。ここは非常に重要な点などで、踏み込んで解説したいと思います。
また、Python 3 において、半角を1文字、全角を2文字でカウントする方法についても、お話ししたいと思います。
1. len関数
len関数の使い方は次の通りです。
len(文字列)
引数(括弧の中に入力する値)には、文字列を直接打ち込むか、文字列を代入している変数を打ち込みます。
次の例をご覧ください。
#引数に文字列を打ち込む場合
print(len("How long is this text?"))
#引数に変数を打ち込む場合
text = "How long is this text?"
print(len(text))
「How long is this text?」という文字列の長さは22文字ですね。数えていただくと分かるのですが、単語の間の半角スペースや、クエスチョンマークも1文字としてカウントされます。
2. Python 3 と Python 2 におけるlen関数の違い
このようにlen関数は、文字列の長さを返してくれます。ただし、Python 2 と Python 3 では、len関数の挙動が大きく異なります。
解説していきますね。重要な点なので、しっかりと理解しておきましょう。
2.1. Python 3 の場合
Python 3 では、1バイト文字も、マルチバイト文字も、同じ1つの文字としてカウントされます。
「バイト文字」を簡潔に説明すると次の通りです。
- 1バイト文字:半角英数字や記号
- マルチバイト文字:ひらがなや全角カタカナ、漢字、全角記号
詳しくは、Wikipedaの『2バイト言語』が理解しやすいと思います。繰り返しになりますが Python 3 では、両者とも同様にカウントされます。
以下をご覧ください。
text1 = "How long is this text?"
print(len(text1))
text2 = "この文字列の長さは?"
print(len(text2))
text3 = "この文字列の長さはhow long?"
print(len(text3))
Python 3 では、半角、全角問わず 1 文字としてカウントされていることが分かりますね。
2.2. Python 2 の場合
Python 2 の場合はどうかと言うと、実は全く異なるのです。なぜなら、Python 3 と Python 2 では、そもそもの文字列の扱いが大きく異なるからです。
それについては、割愛するとして、次の例をご覧ください。
text1 = "How long is this text?"
print len(text1)
text2 = "この文字列の長さは"
print len(text2)
text3 = "この文字列の長さはhow long?"
print len(text3)
これを見ると、分かることは以下の通りです。
- Python2では半角英数字は、1文字としてカウントされている。
- Python2では全角日本語は、2文字としてカウントされている。
例えば、「この文字列の長さは」という文の長さは 9 語ですが、Python 2 では 18 と出力されていますね。
Python 2 では、全ての文字を1文字としてカウントするには、次のように、文字列の前に「u」をつけてユニコード化する必要があります。なお、ユニコードとは、世界のあらゆる文字を、ある1つの文字コードを使って表現することを目的に作られている規格です。ユニコードでは、例えば、「あ」は「U+3042」と表し、「a」は「U+0061」と表します。
Python 2 では、文字列の先頭に「u」をつけることによって、ユニコード化します。
以下をご覧ください。
text4 = u"この文字列の長さはhow long?"
print len(text4)
余談になりますが、Python 2 では、文字列とは通常の文字列とユニコード文字列の両方を含んでいました。Python 3 では、全ての文字列がユニコード文字列になりました。これが、両者におけるlen関数の挙動が異なる理由です。
ご興味がある方は、調べてみてくださいね。文字列に対する理解が大きく深まるはずです。
3. Python3で半角1文字、全角2文字でカウントする方法
Python 3 になって文字列と扱いは、非常にスッキリとなり、他のプログラミング言語を組み合わせた開発が行いやすくなりました。
その辺りの理由は、「Python 3 誕生の理由 – つまり、なぜ unicode/str/bytes の仕様は変更されたのか」で、Python 3 の開発チームの方が、詳しく語られています。
しかし、時に、Python 3 で、2バイト文字を2文字として数えたい時があります。そのような時は、unicodedata モジュールの、east_asian_width 関数を使います(モジュールについては「Pythonのモジュールとは」をご覧ください)。
east_asian_width 関数は、引数に入力した値によって、それぞれ、
- F(Fullwidth):全角文字を表す。全角英数など。
- H(Halfwidth):半角文字を表す。半角カナなど。
- W(Wide):漢字や仮名文字、句読点など東アジアの文字。
- Na(Narrow):半角英数など。
- A:(Ambiguous):ギリシア文字やキリル文字など。
- N(Neutral):全角でも半角でもない。アラビア文字など。
を返します。
以下でご確認ください。
import unicodedata
print(unicodedata.east_asian_width('a'))
print(unicodedata.east_asian_width('A'))
print(unicodedata.east_asian_width('あ'))
print(unicodedata.east_asian_width('ア'))
print(unicodedata.east_asian_width('Å'))
この、east_asian_width 関数の戻り値を使って、半角文字を1文字、全角文字を2文字としてカウントする関数を作ることができます。
それが次のものです。
import unicodedata
def len_count(text):
count = 0
for c in text:
if unicodedata.east_asian_width(c) in 'FWA':
count += 2
else:
count += 1
return count
print(len_count('あいうえお'))
print(len_count('abcde'))
print(len_count('アイウエオ'))
print(len_count('ああaa'))
このコードを理解するには、以下の記事にも目を通しておきましょう。
4. まとめ
Pythonにおける文字列の長さの確認方法について解説してきました。最後に要点をまとめておきます。
文字列の長さを確認するにはlen関数を使う。
- Python 2 では、1バイト文字は1文字、2バイト文字は2文字としてカウントする。
- Python 3 では、文字列はユニコード文字列と同義のため全て1文字としてカウントする。
- Python 3 で半角1文字と全角2文字でカウントしたい場合は、unicodedataモジュールの east_asian_witdh関数を使う。
ぜひ、マスターしてくださいね。
なお、len関数は、リストの長さを確認する時にも使うことができます。「Pythonのリストの長さを確認する方法」もあわせてご覧ください。
コメント