将缩进字符串转换为括号

问题描述 投票:0回答:3

我有一个带有缩进文本的变量。我需要做的就是将该字符串转换为带括号的字符串。示例代码如下:

def indent_to_bracket(text):
    ...
    return text

text='''
def main():
    print('hi')
    if(2==2):
        print('games')
    print('yo!')
    for i in range(5):
        print(i)
        if(i>2):
            print('end1')
        else:
            print('end2')
'''
text=indent_to_bracket(text)
print(text)

所需输出:

def main(){
    print('hi')
    if(2==2){
        print('games')
    }
    print('yo!')
    for i in range(5){
        print(i)
        if(i>2){
            print('end1')
        }
        else{
            print('end2')
        }
    }
}

我尝试过的是这个,但效果不佳:

def indent_to_brackets(text):
    t=0
    ls=text.splitlines()
    for i in range(len(ls)):
        tab=ls[i].count('    ') # 4 tabs or \t
        if tab > t:
            t+=1
            ls[i-1]=ls[i-1]+'{'
        elif tab < t:
            t-=1
            ls[i-1]=ls[i-1]+'\n'+'\t'*(tab-1)+'}'
    return '\n'.join(char for char in ls).replace(':','')
python string replace indentation python-re
3个回答
0
投票

一个问题是

tab=ls[i].count('    ')
无法获取前导空格的长度。如果你想做 Python 所做的事情,首先用空格替换制表符,然后得到差异
len(s)-len(s.lstrip(' '))

这可以处理该示例,但它不支持 () 中允许的换行,其中换行符被忽略。为此,您需要以与缩进深度相同的方式跟踪括号嵌套深度。


0
投票

其实我想了一些办法,确实有效,但不是有效的办法。希望它可以帮助你们中的一些人:

def remove_items(test_list, item):
    res = [i for i in test_list if i != item]
    return res

def formater(z):
    i=f=0
    s=""
    l='{'
    r='}'
    o=lambda:s+("\n"+"\t"*i)*f+c
    for c in z:
        if c in l:
            f=1
            s=o()
            i+=1
        elif c in r:
            i-=1
            f=1
            s=o()
        else:
            s=o()
            f=0

    s_ls=s.splitlines()

    for i in range(len(s_ls)):
        if ';' in s_ls[i]:
            nTabs=len(s_ls[i].split('\t'))-1
            v=';\n'+'\t'*nTabs
            l=s_ls[i].split(';')
            s_ls[i]=v.join(char for char in l)
    s='\n'.join(char for char in s_ls)
    return s

    return s.replace('')
            
def indent_to_brackets(text):
    t=0
    ls=text.splitlines()
    for i in range(len(ls)):
        tab=ls[i].count('    ') # 4 tabs or \t
        if tab > t:
            t+=1
            ls[i-1]=ls[i-1].strip()+'{'
        elif tab < t:
            t-=1
            ls[i-1]=ls[i-1].strip()+'}'
        else:
            ls[i]=ls[i].strip()
    text=''.join(char.strip() for char in ls).replace(':','')
    l=text.count('{')
    r=text.count('}')
    if l > r:
        ans=l-r
        text=text+'}'*ans
    else:
        return 0
    text=formater(text)
    return text

text='''
def main():
    print('hi');
    if(2==2):
        print('games');
    print('yo!');
    for i in range(5):
        print(i);
        if i>2:
            print('end1');
        else:
            print('end2');
'''

text=indent_to_brackets(text)
print(text)

有任何改进代码的想法请告诉我。


0
投票

此代码查找行尾的所有冒号,并将它们替换为左大括号。然后它会发现缩进的任何减少,并根据缩进降低的程度将右括号放在那里。

code = '''#include <stdio.h>

char * text2print = "Hello World!";

## Start function
def start():
    if (condition):
        printf("something else");
        if (other condition):
            printf("another thing");
    if (condition):
        printf("something else");
    printf(text2print);
    return 0;'''

code = code.replace("    ", "\t")

new_code = ""
prev_level = 0
for line in code.splitlines():
    new_level = 0
    for char in line:
        if char == "\t":
            new_level += 1
        else:
            break
    for i in range(prev_level - new_level):
        new_code += "\t"*(new_level+((prev_level - new_level)-i-1)) + "}\n"
    prev_level = new_level
    if line.endswith(":"):
        line = line[:-1] + " {"
    new_code += line + "\n"
new_code += "}\n"

print(new_code)

此输出与此。

#include <stdio.h>

char * text2print = "Hello World!";

## Start function
def start() {
        if (condition) {
                printf("something else");
                if (other condition) {
                        printf("another thing");
                }
        }
        if (condition) {
                printf("something else");
        }
        printf(text2print);
        return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.