Pythonで文字列の長さ(文字数)を取得

Pythonで文字列(str型オブジェクト)の長さ(文字数)を取得するには、リストなどの要素数を取得するのと同様に組み込み関数len()を使います。

  1. 組み込み関数 len() — Python 3.6.5 ドキュメント

以下の内容について説明します。

len関数で文字列の長さ(文字数)を取得 全角・半角の扱い エスケープシーケンス(特殊文字など)の扱い 改行を含む場合の注意

そのほかの型のオブジェクトに対するlen()の使い方は

len関数で文字列の長さ(文字数)を取得

組み込み関数len()の引数に文字列を渡すと、その長さ(文字数)が整数値で返されます。

s = 'abcde'

print(len(s))
# 5

変数に代入してもいい。

s_length = len(s)

print(s_length)
# 5

print(type(s_length))
# <class 'int'>

全角・半角の扱い

全角文字も半角文字も1文字(長さ1)として扱われる。

s = 'あいうえお'

print(len(s))
# 5

s = 'abcdeあいうえお'

print(len(s))
# 10

半角1文字、全角2文字として文字幅を取得したい場合は

エスケープシーケンス(特殊文字など)の扱い

Pythonの文字列では、タブ文字などの特殊文字はバックスラッシュを使って\tのように表す(バックスラッシュ自体は\)。 これらのエスケープシーケンスはひとつで1文字として扱われる。

s = 'a\tb\\c'
print(s)
# a b\c

print(len(s))
# 5

エスケープシーケンスを無効化するraw文字列で文字列を作成した場合は、特殊文字などに解釈されずそのままの文字列として扱われる。文字数もそのままカウントされます。

s = r'a\tb\\c'
print(s)
# a\tb\\c

print(len(s))
# 7

また、Unicodeエスケープシーケンス\uXXXXも1文字として扱われる。

s = '\u3042\u3044\u3046'
print(s)
# あいう

print(len(s))
# 3

Unicodeエスケープシーケンスもraw文字列を使うと無効化されます。

s = r'\u3042\u3044\u3046'
print(s)
# \u3042\u3044\u3046

print(len(s))
# 18

改行を含む場合の注意

改行を表す\n(LF: Line Feed)も1文字として扱われる。

s = 'a\nb'
print(s)
# a
# b

print(len(s))
# 3

Windows系OSで\r(CR: Carriage Return)を含む\r\n(CR + LF)で改行されている場合は、\rと\nの2文字となるので気をつけてください。

s = 'a\r\nb'
print(s)
# a
# b

print(len(s))
# 4

\nと\r\nが混在している場合は、同じように改行されていても改行部分の文字数がそれぞれ異なります。

s = 'abc\nabcd\r\nab'
print(s)
# abc
# abcd
# ab

print(len(s))
# 12

\nと\r\nが混在している場合やどちらが使われているかわからない場合は、行ごとに分割してリストを返すsplitlines()メソッドを使います。

print(s.splitlines())
# ['abc', 'abcd', 'ab']

splitlines()で取得したリストの要素数(len()で取得)が行数に等しい。

print(len(s.splitlines()))
# 3

各行の文字数はリスト内包表記で取得できます。

print([len(line) for line in s.splitlines()])
# [3, 4, 2]

各行の文字数の合計はsum()で算出できます。ここではリスト内包表記のジェネレータ版(ジェネレータ式)を使っています。ジェネレータ式は[]ではなく()で囲むが、この例のように()内で使うときは内包表記の()は省略できます。

print(sum(len(line) for line in s.splitlines()))
# 9
Last Updated: 6/26/2019, 10:34:03 PM