一連の文字列のアナライザーを構築しています。各行がどれだけインデントされているか (タブまたはスペース) を確認する必要があります。
各行は、テキスト エディターでは単なる文字列です。文字列がどれだけインデントされているかを確認するにはどうすればよいですか?
というか、文字列の前にある空白または \t の量を確認できるかもしれませんが、方法がわかりません。
一連の文字列のアナライザーを構築しています。各行がどれだけインデントされているか (タブまたはスペース) を確認する必要があります。
各行は、テキスト エディターでは単なる文字列です。文字列がどれだけインデントされているかを確認するにはどうすればよいですか?
というか、文字列の前にある空白または \t の量を確認できるかもしれませんが、方法がわかりません。
文字列の先頭にあるスペースの数を数えるには、左側の削除された(空白が削除された)文字列と元の文字列を比較します。
a = " indented string"
leading_spaces = len(a) - len(a.lstrip())
print(leading_spaces)
# >>> 4
タブインデントはコンテキスト固有です...タブ文字を表示しているプログラムの設定に基づいて変化します。このアプローチでは、空白文字の総数のみが表示されます(各タブは1文字と見なされます)。
またはデモンストレーションする:
a = "\t\tindented string"
leading_spaces = len(a) - len(a.lstrip())
print(leading_spaces)
# >>> 2
編集:
ファイル全体に対してこれを実行したい場合は、試してみることをお勧めします
with open("myfile.txt") as afile:
line_lengths = [len(line) - len(line.lstrip()) for line in afile]
Gizmo の基本的なアイデアは優れていると思います。文字列オブジェクトのexpandtabs()
メソッドを使用して、先頭のタブとスペースの混合を処理するように拡張するのは比較的簡単です。
def indentation(s, tabsize=4):
sx = s.expandtabs(tabsize)
return 0 if sx.isspace() else len(sx) - len(sx.lstrip())
print indentation(" tindented string")
print indentation("\t\tindented string")
print indentation(" \t \tindented string")
最後の 2 つの print ステートメントは同じ値を出力します。
編集:すべてのタブとスペースの行が見つかった場合、チェックして0を返すように変更しました。