re.sub()的递归

时间:2014-05-02 23:18:44

标签: python regex

如果我们按如下方式使用它:

re.sub("a\(\s*\d*\s*,\s*\d*\s*\)", "100", "a(440, 330)"

我们得到:

>> "100"

现在,我们在a()内有a()

re.sub("a\(\s*\d*\s*,\s*\d*\s*\)", "100", "a(30, a(30,30))")

我们得到:

>> 'a(30, 100)'

但我想要这样的事情:

1. a(30, a(30,30)) # replace the nested 'a' 
2. a(30, 100) # now work with the remainder
3. '100' # final string

抱歉我的英文。

2 个答案:

答案 0 :(得分:7)

继续更换,直到没有任何东西可以替换:

while True:
    output = re.sub("a\(\s*\d*\s*,\s*\d*\s*\)", "100", input)
    if output == input:
        break
    input = output

答案 1 :(得分:3)

你可以在没有while循环的情况下使用'+'选项来表示多重匹配。

re.sub("[a\(\s*\d*\s*,\s*\d*\s*\)]+", "100", "a(30, a(30,30))")

我也倾向于忘记一段时间没有立即打击你的正则表达式选项。列表/打印&把它放在你面前。随着时间的推移,你最终会注意到/记住匹配案例的所有可能选项