字符串解碼
eg:
ss=2[abc]3[cd]ef return:abcabccdcdcdef
ss=3[a2[c]]2[a] return:accaccaccaa
ss=10[abc]3[cd]ef return:abcabcabcabcabcabcabcabcabcabccdcdcdef
如何實現前面例子的效果呢?
首先分析s='2[abc]',要得到字符串'abcabc'非常容易
In [102]: int(s[0])*s[2:5]
Out[102]: 'abcabc'
其中,s[2:5]中的2代表‘[’之后的位置,5代表‘]’的位置,那么我就有啟發了,如果我能得到‘[]’之間的內容以及‘[’前面的數字,就可以完成一個中括號之間的字符串相乘了。
1、首先找到第一個匹配的中括號[],可以遍歷整個字符串。找到一個‘[’就用index_1記錄下來,繼續遍歷,當下一個'['出現的時候,index_1的值會更新,直到找到‘]’記錄位置index_2,此時的‘index_1和index_2就是要找的第一個'[]'。
2、獲取index_1到index_2的內容
3、獲取index_1前面的數字,注意數字可能是很多位數。從index_1的前一個開始遍歷,如果是數字就加入字符串num里面,注意要加在字符串的前面,直到第一個非數字出現,則跳出for循環。
具體代碼如下:
def onestr(ss):
for i in range(len(ss)):
if ss[i] == '[':
index_1=i #記錄方括號開始的位置
#print(index_1)
if ss[i]==']':
index_2=i #記錄方括號結束的位置
temp=ss[index_1:index_2+1] #取出方括號開始以及結束的位置
#取出方括號[前面的數字,由於數字可能為多位,所以用while循環實現
num=''
j=1
while(1):
#從[的前一個位置開始找,直到不是數字為止
if ss[index_1-j].isdigit():
num=ss[index_1-j]+num #num為字符串類型
j=j+1
continue
else:
break
break
return temp,num
onestr('2[abc]3[cd]ef')
一次操作的結果為:
temp,num='[abc]','2'
將abc和2相乘的結果,替換掉源字符串2[abc]
ss=ss.replace(num+str_temp,int(num)*str_temp.lstrip('[').rstrip(']'))
由於temp='[abc]',直接相乘會把[]符號也乘進去,因此需要去掉兩邊的符號。
ss=abcabc3[cd]ef
一個方括號需要一次相乘,n個方括號就需要n次相乘,因此一個while循環,循環條件為方括號的個數,即可實現整個字符串的替換。
ss=input()
print(ss)
i=0
N=ss.count('[')
while(i<N):
str_temp,num=onestr(ss) ss=ss.replace(num+str_temp,int(num)*str_temp.lstrip('[').rstrip(']')) i=i+1
print(ss)
程序代碼:
def onestr(ss):
for i in range(len(ss)):
if ss[i] == '[':
index_1=i #記錄方括號開始的位置
if ss[i]==']':
index_2=i #記錄方括號結束的位置
temp=ss[index_1:index_2+1] #取出方括號開始以及結束的位置
num=''
j=1
while(1):
if ss[index_1-j].isdigit(): #從[的前一個位置開始找,直到不是數字為止
num=ss[index_1-j]+num #num為字符串類型
j=j+1
continue
else:
break
break
return temp,num
ss=input()
print(ss)
i=0
N=ss.count('[')
while(i<N):
str_temp,num=onestr(ss)
ss=ss.replace(num+str_temp,int(num)*str_temp.lstrip('[').rstrip(']'))
i=i+1
print(ss)