如何自动缩进下一行字符串

How to auto indent next line of string

我正在尝试使用 Python 制作一个程序,当遇到某些字符(例如大括号)时,它会自动缩进字符串的下一行。

例如:

public class Example{

--indent--> public static void main (String[]args){

--indent--> System.out.println("Hello");
}
}

我似乎无法理解为了实现这一点我需要编写什么代码。

如有任何帮助,我们将不胜感激!

这是一种快速而肮脏的方法。基本上我只是遍历输入字符串的行 (cppcode) 并跟踪当前缩进 (tabdepth)。当我在输入行中遇到大括号时,我会向上或向下增加 tabdepth,然后将 tabdepth 个制表符添加到输出行。

cppcode = '''
public class Example{

public static void main (String[]args){

System.out.println("Hello");
}
}
'''


tabdepth = 0

for line in cppcode.split("\n"):
    depth_changed = False
    indentedline = ''.join(['\t'*tabdepth, line])
    for c in line:
        if c == '{':
            tabdepth += 1

        elif c == '}':
            tabdepth -= 1
            depth_changed = True

    if depth_changed: 
        indentedline = ''.join(['\t'*tabdepth, line])

    print(indentedline)

老实说,您设置代码的确切方式取决于您是否对它进行了其他操作 "pretty print"。 大致的轮廓可能看起来像这样

def pretty(s):
    start = "{"
    end = "}"
    level = 0
    skip_start = False

    for c in s:
        # raise or lower indent level
        if c == start:
            level += 1
        if c == end:
            level -= 1

        if level < 0:
            raise IndentationError("Error Indenting")

        if c == "\n":
            skip_start = True # I'm bad at naming just a flag to mark new lines

        if c.isspace() and skip_start:
            pass #skip whitspace at start of line
        else:
            if skip_start:
                print("\n", "  " * level, end="") #print indent level
                skip_start = False
            print(c, end = "") #print  character

pretty('''
public class Example{



public static void main (String[]args){
if (1==1){
    //do thing
//do other thing
             // weird messed up whitespace
}else{
System.out.println("Hello");
}
}
}
''')

会输出

 public class Example{
   public static void main (String[]args){
     if (1==1){
       //do thing
       //do other thing
       // weird messed up whitespace
     }else{
       System.out.println("Hello");
     }
   }
 }