【问题标题】:Check string indentation?检查字符串缩进?
【发布时间】:2012-10-25 20:05:43
【问题描述】:

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

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

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

【问题讨论】:

  • 你知道空间是如何表示的吗?标签?计算发生次数,你就可以走了,不是吗?
  • 制表符和空格会在行首混用吗?
  • @jbowes ,对不起,我打算发布我尝试过的内容,但当时在工作中遇到了问题。我几乎尝试了 Gizmo 下面建议的方法,即减去长度。制表符和空格可能混合在一起,但我相信所有工作中的程序都是 4 个空格制表符,所以如果我能弄清楚什么是制表符和什么是空格,我可以获得一个很好的缩进值

标签: python indentation analysis lint


【解决方案1】:

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

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]

【讨论】:

  • 这就是我得到的解决方案,但我不知道如何区分什么是制表符和什么是空格?
  • @DhruvGovil 你是对的......这不会告诉你它是标签还是空格。如果你想知道有多少空格,我会使用 martineau 提到的 line.expandtab(4) 将标签扩展到空格。这将告诉您空格的绝对数量。将没有文本的行的行长归零也是一个好主意。
  • 不幸的是,这仅在您知道字符串前面存在空格时才有效。如果字符串的末尾恰好也有空格,那么您的结果将是倾斜的。
【解决方案2】:

我认为 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")

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

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

【讨论】:

  • 谢谢,之前错过了,但是 expandtabs 确实很方便。
【解决方案3】:
def count_indentation(line) : 
    count = 0 
    try : 
        while (line[count] == "\t") : 
            count += 1 
        return count
    except : 
        return count

【讨论】:

    【解决方案4】:

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

    indent_count = re.sub(r'^([\s]*)[\s]+.*$', r'\g<1>', line).count(' ')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      相关资源
      最近更新 更多