import re
s = 'K4[ON(SO3)2]2'
target = s.replace('[', '(').replace(']', ')')
while True:
m = re.search(r'(\(([^()]*)\)(\d+))', target)
if not m:
break
substr, data, num = m.groups()
target = target.replace(substr, data * int(num))
result = {}
for m in re.finditer(r'([A-Z][a-z]?)(\d+)?', target):
el, num = m.groups('1')
result[el] = result.get(el, 0) + int(num)
print(list(result.items()))
aW1wb3J0IHJlCgpzID0gJ0s0W09OKFNPMykyXTInCgp0YXJnZXQgPSBzLnJlcGxhY2UoJ1snLCAnKCcpLnJlcGxhY2UoJ10nLCAnKScpCndoaWxlIFRydWU6CiAgICBtID0gcmUuc2VhcmNoKHInKFwoKFteKCldKilcKShcZCspKScsIHRhcmdldCkKICAgIGlmIG5vdCBtOgogICAgICAgIGJyZWFrCiAgICBzdWJzdHIsIGRhdGEsIG51bSA9IG0uZ3JvdXBzKCkKICAgIHRhcmdldCA9IHRhcmdldC5yZXBsYWNlKHN1YnN0ciwgZGF0YSAqIGludChudW0pKQoKcmVzdWx0ID0ge30KZm9yIG0gaW4gcmUuZmluZGl0ZXIocicoW0EtWl1bYS16XT8pKFxkKyk/JywgdGFyZ2V0KToKICAgIGVsLCBudW0gPSBtLmdyb3VwcygnMScpCiAgICByZXN1bHRbZWxdID0gcmVzdWx0LmdldChlbCwgMCkgKyBpbnQobnVtKQoKcHJpbnQobGlzdChyZXN1bHQuaXRlbXMoKSkp