Python 检查字符串缩进?

Python 检查字符串缩进?,python,indentation,analysis,lint,Python,Indentation,Analysis,Lint,我正在为一系列字符串构建一个分析器。 我需要检查每行缩进多少(通过制表符或空格) 在文本编辑器中,每一行只是一个字符串。 如何检查字符串缩进的程度 或者更确切地说,我可以检查字符串前面有多少空格或\t,但我不确定如何检查。要计算字符串开头的空格数,您可以在左剥离(删除空格)字符串和原始字符串之间进行比较: a = " indented string" leading_spaces = len(a) - len(a.lstrip()) print(leading_spaces) # >

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

在文本编辑器中,每一行只是一个字符串。 如何检查字符串缩进的程度


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

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

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]

我认为Gizmo的基本思想是好的,通过使用string对象的
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")
最后两个print语句将输出相同的值

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

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

def count_indentation(line) : 
    count = 0 
    try : 
        while (line[count] == "\t") : 
            count += 1 
        return count
    except : 
        return count
indent\u count=re.sub(r'^([\s]*)[\s]+.*$',r'\g',行)。count(“”)

看看你知道空间是如何表示的吗?账单?数一数发生的事情,你就可以开始了,不是吗?制表符和空格会在一行开始时混合使用吗?@jbowes,对不起,我本来想发布我尝试过的内容,但当时工作中遇到了大量问题。我尝试了Gizmo建议的减去长度的方法。制表符和空格可能是混合的,但我相信所有工作的程序都是4个空格制表符,所以如果我能弄清楚什么是制表符,什么是空格,我就能得到一个很好的缩进值,这就是我得到的解决方案,但我不会混淆如何区分什么是制表符,什么是空格?@DhruvGovil你是对的。。。这不会告诉你它是一个标签还是一个空格。如果您想知道我会使用多少空格,请参见martineau提到的
line.expandtab(4)
,将选项卡展开为空格。这将告诉您空间的绝对数量。将没有文本的行的行长度归零也是一个好主意。不幸的是,只有知道字符串前面有空格时,这才有效。如果字符串的结尾碰巧也有空格,则结果将发生倾斜。谢谢,前面没有提到这一点,但expandtabs确实很方便。
indent_count = re.sub(r'^([\s]*)[\s]+.*$', r'\g<1>', line).count(' ')