Pythonで文字列の長さ(文字数)を取得
Pythonで文字列(str
型オブジェクト)の長さ(文字数)を取得するには、リストなどの要素数を取得するのと同様に組み込み関数len()
を使う。
以下の内容について説明する。
- 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
各行の文字数はリスト内包表記で取得できる。
- 関連記事: Pythonリスト内包表記の使い方
print([len(line) for line in s.splitlines()])
# [3, 4, 2]
各行の文字数の合計はsum()
で算出可能。ここではリスト内包表記のジェネレータ版(ジェネレータ式)を使っている。ジェネレータ式は[]
ではなく()
で囲むが、この例のように()
内で使うときは内包表記の()
は省略可能。
print(sum(len(line) for line in s.splitlines()))
# 9