Вы можете сделать это не так много кода с помощью re.split - да, это правильно, re.split .
Вот документы :
Обратить вашу проблему: разделите ваш ввод с помощью шаблона разделителя, который соответствует действительному количеству атомов +.Имейте группу захвата так, чтобы строки разделителя были сохранены.Если входная строка верна, все неделитеры в результате будут пустыми строками.
>>> tests= (
... 'C6H5Fe2I',
... 'H2TeO4',
... 'H3PoooO5',
... 'C2tH6',
... 'Bad\n')
>>> import re
>>> pattern = r'([A-Z][a-z]{0,2}\d*)'
>>> for test in tests:
... pieces = re.split(pattern, test)
... print "\ntest=%r pieces=%r" % (test, pieces)
... data = pieces[1::2]
... rubbish = filter(None, pieces[0::2])
... print "rubbish=%r data=%r" % (rubbish, data)
...
test='C6H5Fe2I' pieces=['', 'C6', '', 'H5', '', 'Fe2', '', 'I', '']
rubbish=[] data=['C6', 'H5', 'Fe2', 'I']
test='H2TeO4' pieces=['', 'H2', '', 'Te', '', 'O4', '']
rubbish=[] data=['H2', 'Te', 'O4']
test='H3PoooO5' pieces=['', 'H3', '', 'Poo', 'o', 'O5', '']
rubbish=['o'] data=['H3', 'Poo', 'O5']
test='C2tH6' pieces=['', 'C2', 't', 'H6', '']
rubbish=['t'] data=['C2', 'H6']
test='Bad\n' pieces=['', 'Bad', '\n']
rubbish=['\n'] data=['Bad']
>>>