我有一个带有缩进文本的变量。我需要做的就是将该字符串转换为带括号的字符串。示例代码如下:
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(':','')
一个问题是
tab=ls[i].count(' ')
无法获取前导空格的长度。如果你想做 Python 所做的事情,首先用空格替换制表符,然后得到差异 len(s)-len(s.lstrip(' '))
。
这可以处理该示例,但它不支持 () 中允许的换行,其中换行符被忽略。为此,您需要以与缩进深度相同的方式跟踪括号嵌套深度。
其实我想了一些办法,确实有效,但不是有效的办法。希望它可以帮助你们中的一些人:
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)
有任何改进代码的想法请告诉我。
此代码查找行尾的所有冒号,并将它们替换为左大括号。然后它会发现缩进的任何减少,并根据缩进降低的程度将右括号放在那里。
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;
}