-1

文字列の中括弧の間のすべてを削除しようとしており、それを再帰的に実行しようとしています。そしてx、再帰が終わったらここに戻ってくるのですが、なぜか関数doitがここに戻ってきNoneます。xdef内で印刷すると正しい文字列が印刷されますが。私は何を間違っていますか?

strs = "i am a string but i've some {text in brackets} braces, and here are some more {i am the second one} braces"
def doit(x,ind=0):
   if x.find('{',ind)!=-1 and x.find('}',ind)!=-1:
     start=x.find('{',ind)
     end=x.find('}',ind)
     y=x[start:end+1]
     x=x[:start]+x[end+1:]
     #print(x)
     doit(x,end+1)
   else:
       return x

print(doit(strs))

出力:
None

4

3 に答える 3

3

ifブロックが成功した場合、何も返されません。returnステートメントはブロック内にあり、else他のすべてがそうでない場合にのみ実行されます。再帰から取得した値を返したい。

if x.find('{', ind) != -1 and x.find('}', ind) != -1:
    ...
    return doit(x, end+1)
else:
    return x
于 2012-06-19T09:08:30.463 に答える
1
...
#print(x)
doit(x,end+1)
...

する必要があります

...
#print(x)
return doit(x,end+1)
...

returnif ブロックにステートメントがありません。関数がそれ自体を再帰的に呼び出す場合、その呼び出しの戻り値は返されません。

于 2012-06-19T09:09:34.290 に答える
1

正規表現を使用する方が簡単であることに注意してください。

import re
strs = "i am a string but i've some {text in brackets} braces, and here are some more {i am the second one} braces"
strs = re.sub(r'{.*?}', '', strs)
于 2012-06-19T09:15:24.850 に答える