note.nkmk.me

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

Date: 2018-06-06 / tags: Python, 文字列操作
このエントリーをはてなブックマークに追加

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

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

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

そのほかの型のオブジェクトに対するlen()の使い方は以下の記事を参照。

スポンサーリンク

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

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

s = 'abcde'

print(len(s))
# 5
source: str_len.py

変数に代入してもいい。

s_length = len(s)

print(s_length)
# 5

print(type(s_length))
# <class 'int'>
source: str_len.py

全角・半角の扱い

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

s = 'あいうえお'

print(len(s))
# 5

s = 'abcdeあいうえお'

print(len(s))
# 10
source: str_len.py

半角1文字、全角2文字として文字幅を取得したい場合は以下の記事を参照。

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

Pythonの文字列では、タブ文字などの特殊文字はバックスラッシュを使って\tのように表す(バックスラッシュ自体は\\)。

これらのエスケープシーケンスはひとつで1文字として扱われる。

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

print(len(s))
# 5
source: str_len.py

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

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

print(len(s))
# 7
source: str_len.py

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

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

print(len(s))
# 3
source: str_len.py

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

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

print(len(s))
# 18
source: str_len.py

改行を含む場合の注意

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

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

print(len(s))
# 3
source: str_len.py

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
source: str_len.py

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

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

print(len(s))
# 12
source: str_len.py

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

print(s.splitlines())
# ['abc', 'abcd', 'ab']
source: str_len.py

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

print(len(s.splitlines()))
# 3
source: str_len.py

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

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

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

print(sum(len(line) for line in s.splitlines()))
# 9
source: str_len.py
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事