<p>我将使用正则表达式标记输入,并使用递归处理标记:</p>
<pre><code>import re
def breakInChunks(s):
chunks = dict()
tokens = re.finditer(r"([^()]+|.?)", s)
def recur(start):
result = ""
for match in tokens:
if match[0] in ")":
key = f"{start}${match.start()}"
chunks[key] = result
return key
result += f"[{recur(match.start())}]" if match[0] == "(" else match[0]
recur(0)
return chunks
</code></pre>
<p>例如:</p>
<pre><code>s = "(7+x+8*(9+10(11+12)+14))-(2*(34))"
chunks = breakInChunks(s)
</code></pre>
<p><code>chunks</code>将是:</p>
<pre><code>{
'12$18': '11+12',
'7$22': '9+10[12$18]+14',
'0$23': '7+x+8*[7$22]',
'28$31': '34', '25$32':
'2*[28$31]',
'0$33': '[0$23]-[25$32]'
}
</code></pre>
<p>请注意,最后一个条目不是您问题中给出的<code>'24:25': '-'</code>,而是<code>'0$33': '[0$23]-[25$32]'</code>,这与应用于其他条目的逻辑更为一致</p>
<p>对于更复杂的示例:</p>
<pre><code>s = "(7+y+(66+7)+(32+(78*19-(32-0)))+(32-9))+8+9+(9-10)-(9/7)-10"
chunks = breakInChunks(s)
</code></pre>
<p><code>chunks</code>现在是:</p>
<pre><code>{
'5$10': '66+7',
'23$28': '32-0',
'16$29': '78*19-[23$28]',
'12$30': '32+[16$29]',
'32$37': '32-9',
'0$38': '7+y+[5$10]+[12$30]+[32$37]',
'44$49': '9-10',
'51$55': '9/7',
'0$59': '[0$38]+8+9+[44$49]-[51$55]-10'
}
</code></pre>