fork download
  1. import re
  2. from collections import defaultdict
  3.  
  4. _TOKENS = re.compile(r'(?:([A-Z][a-z]?)|\))(\d+)?|(\()')
  5.  
  6. def parse(formula):
  7. counts = defaultdict(int)
  8. stack = []
  9. for token in _TOKENS.finditer(formula):
  10. element, subscript, start_subformula = token.groups()
  11. subscript = 1 if subscript is None else int(subscript)
  12. if element:
  13. counts[element] += 1 if subscript is None else subscript
  14. elif start_subformula:
  15. stack.append(counts)
  16. counts = defaultdict(int)
  17. else:
  18. previous = stack.pop()
  19. for elem, total in counts.items():
  20. previous[elem] += total * subscript
  21. counts = previous
  22. for element, total in sorted(counts.items()):
  23. print '{:>2}: {}'.format(element, total)
  24.  
  25.  
  26. inputs = '''
  27. C6H12O6
  28. CCl2F2
  29. NaHCO3
  30. C4H8(OH)2
  31. PbCl(NH3)2(COOH)2'''
  32.  
  33. for line in inputs.splitlines():
  34. print line
  35. parse(line)
  36. print
Success #stdin #stdout 0s 23688KB
stdin
Standard input is empty
stdout

C6H12O6
 C: 6
 H: 12
 O: 6

CCl2F2
 C: 1
Cl: 2
 F: 2

NaHCO3
 C: 1
 H: 1
Na: 1
 O: 3

C4H8(OH)2
 C: 4
 H: 10
 O: 2

PbCl(NH3)2(COOH)2
 C: 2
Cl: 1
 H: 8
 N: 2
 O: 4
Pb: 1