5

我正在为一系列字符串构建分析器。我需要检查每行缩进多少(通过制表符或空格)。

每行只是文本编辑器中的一个字符串。如何检查字符串缩进多少?

或者更确切地说,也许我可以检查字符串前有多少空格或 \t,但我不确定如何。

4

4 回答 4

17

要计算字符串开头的空格数,您可以在左侧剥离(删除空格)字符串和原始字符串之间进行比较:

a = "    indented string"
leading_spaces = len(a) - len(a.lstrip())
print(leading_spaces) 
# >>> 4

制表符缩进是特定于上下文的......它会根据显示制表符字符的任何程序的设置而变化。这种方法只会告诉您空白字符的总数(每个制表符将被视为一个字符)。

或演示:

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]
于 2012-11-05T22:30:33.757 回答
8

expandtabs()我认为 Gizmo 的基本思想很好,并且通过使用字符串对象的方法来扩展它以处理前导制表符和空格的任何混合相对容易:

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")

最后两个打印语句将输出相同的值。

编辑:如果遇到一行所有制表符和空格,我对其进行了修改以检查并返回 0。

于 2012-11-05T23:02:46.380 回答
2

len() 方法会将制表符 (\t) 计为一个。在某些情况下,它不会按预期运行。所以我的方法是使用 re.sub 然后计算空间。

indent_count = re.sub(r'^([\s]*)[\s]+.*$', r'\g<1>', line).count(' ')
于 2020-02-19T07:58:52.190 回答
0
def count_indentation(line) : 
    count = 0 
    try : 
        while (line[count] == "\t") : 
            count += 1 
        return count
    except : 
        return count
于 2019-05-28T01:17:40.840 回答