Kimya formülü ayrıştırıcısı

Şurada yazmıştım, buraya da kopyalayayım dedim. Yoksa yaptığım şeylerin takibini yapmak zor oluyor.

# -*- coding: utf-8 -*-
def kimyaparser(formul):
    harfler = []
    sayilar = []
    state = 0
    sonuc = {}
    formul = formul.upper()
    for karakter in formul:
        try:
            karakter = int(karakter)
            #karakter bir sayı
            sayilar.append(karakter)
            state = 1 # en son bir sayı ekledik.
        except ValueError:
            #karakter bir harf
            if state == 1:
                # en son bir sayı eklenmiş
                # demek ki yeni bir atoma geçiliyor.
                anahtar = "".join(harfler)
                if len(sayilar) > 0:
                    deger = int("".join([str(i) for i in sayilar]))
                else:
                    deger = 1
                if anahtar in sonuc:
                    # eğer daha önce bu atom eklendiyse, sayıyı artır
                    sonuc[anahtar] += deger
                else:
                    sonuc[anahtar] = deger
                harfler = [karakter]
                sayilar = []
            else:
                harfler.append(karakter)
            state = 0
    # en son kalanları da ekle:
    anahtar = "".join(harfler)
    if sayilar:
        deger = int("".join([str(i) for i in sayilar]))
    else:
        deger = 1
    if anahtar in sonuc:
        sonuc[anahtar] += deger
    else:
        sonuc[anahtar] = deger
    return sonuc

Kullanımından örnek:

>>> kimyaparser("H2SO4")
{'H': 2, 'SO': 4}
>>> kimyaparser("C78H127N16S8O8")
{'H': 127, 'C': 78, 'S': 8, 'O': 8, 'N': 16}
>>> kimyaparser("C44189H71252N12428O14007S321")
{'H': 71252, 'C': 44189, 'S': 321, 'O': 14007, 'N': 12428}