2

我想创建一个字典来拆分分子式的所有元素。我尝试使用 re 模块

Formula="C16H21NO2Na3"

pat = re.compile('(?P<name>[A-Z][a-z]+)\[0-9]+(?P<name2>[0-9]+)')
molecule= pat.findall(Formula)
print (molecule)

我期待这个回报:

{'C': 16, 'H': 21, 'N': '', 'O': 2, 'Na': 3}
4

1 回答 1

5

你离得很近

pat = re.compile('(?P<name>[A-Z][a-z]?)(?P<value>[0-9]*)')

name是一个大写字母,后跟零个或 1 个小写字母,并且value是 0 个或多个数字

然后让它成为一个 dict 你只需调用 dict 就可以了

matches = pat.findall(Formula)
data = dict(matches)
# {'C': '16', 'H': '21', 'N': '', 'O': '2', 'Na': '3'}

您可以使用 dict 更复杂,如下所示

data = {k: int(v) if v else 1 for k,v in matches}
# {'C': 16, 'H': 21, 'N': 1, 'O': 2, 'Na': 3}

# the following will also work, which is slightly shorter (thanks @copperfield)
data = {k: int(v or 1) for k,v in matches}
# {'C': 16, 'H': 21, 'N': 1, 'O': 2, 'Na': 3}
于 2021-11-24T01:13:07.880 回答