Я разработал пару статей о том, как анализировать молекулярные формулы, включая более сложные формулы, такие как C6H2 (NO2) 3CH3.
Самой недавней является моя презентация " PLY и PyParsing " на PyCon2010, где я сравниваю эти две системы синтаксического анализа Python, используя в качестве примера моего примера анализатор молекулярных формул. Есть даже видео моей презентации .
Презентация была основана на серии статей , состоящей из трех частей Я разработал парсер молекулярных формул с использованием ANTLR. В part 3 я сравниваю решение ANTLR с рукописным анализатором регулярных выражений и решениями в PLY и PyParsing.
Решения regexp и PLY были впервые разработаны в серии , состоящей из двух частей , для двух способов написания синтаксических анализаторов в Python.
Решение регулярного выражения и базовые решения ANTLR / PLY / PyParsing используют регулярное выражение, например [A-Z] [a-z]? \ D *, чтобы сопоставить термины в формуле. Это то, что предложил @David M.
Вот это сработало в Python
import re
# element_name is: capital letter followed by optional lower-case
# count is: empty string (so the count is 1), or a set of digits
element_pat = re.compile("([A-Z][a-z]?)(\d*)")
all_elements = []
for (element_name, count) in element_pat.findall("CH3COOH"):
if count == "":
count = 1
else:
count = int(count)
all_elements.extend([element_name] * count)
print all_elements
Когда я запускаю это (жестко запрограммировано использовать уксусную кислоту, CH3COOH), я получаю
['C', 'H', 'H', 'H', 'C', 'O', 'O', 'H']
Обратите внимание, что этот короткий фрагмент кода предполагает, что молекулярная формула верна. Если вы дадите ему что-то вроде «## $% ^ O2 # $$ #», то он проигнорирует поля, о которых он не знает, и выдаст ['O', 'O']. Если вы этого не хотите, вам придется сделать его немного более устойчивым.
Если вы хотите поддерживать более сложные формулы, такие как C6H2 (NO2) 3CH3, то вам нужно немного узнать о древовидных структурах данных, в частности (как указывает @Roman), абстрактных синтаксических деревьях (чаще всего называемых AST). ). Это слишком сложно, чтобы попасть сюда, поэтому смотрите мои выступления и эссе для более подробной информации.