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()))