【问题标题】:Converting string with indentation to brackets将带有缩进的字符串转换为括号
【发布时间】:2020-12-03 05:26:32
【问题描述】:

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

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(':','')

【问题讨论】:

  • 到目前为止您尝试过什么? stackoverflow 不是代码编写服务。在发布问题之前自己尝试一下

标签: python string replace indentation python-re


【解决方案1】:

一个问题是tab=ls[i].count(' ') 没有得到前导空格的长度。如果你想做 Python 所做的事情,首先用空格替换制表符,然后得到区别len(s)-len(s.lstrip(' '))

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

【讨论】:

    【解决方案2】:

    实际上,我想出了一些办法,它奏效了,但这不是一个有效的方法。希望它可以帮助你们中的一些人:

    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)
    

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

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 2022-12-10
      • 2012-01-28
      • 1970-01-01
      • 2010-09-07
      相关资源
      最近更新 更多