
本文介绍如何用纯python(不依赖第三方库)解析化学式字符串,提取元素符号及其数量,并支持括号嵌套结构,最终生成嵌套元组形式的结构化数据,为化学方程式配平提供基础。
本文介绍如何用纯python(不依赖第三方库)解析化学式字符串,提取元素符号及其数量,并支持括号嵌套结构,最终生成嵌套元组形式的结构化数据,为化学方程式配平提供基础。
正则表达式擅长模式匹配,但无法递归解析嵌套结构(如 (SO₄)₃ 中的括号层级),因此仅靠正则无法可靠完成带括号的化学式分解——这本质上是一个上下文相关语法解析问题,需结合递归或栈式逻辑。下面提供一个轻量、可扩展、无外部依赖的纯Python解决方案。
核心思路:分层解析 + 递归处理
我们将解析过程分为两步:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 原子级提取:识别单个元素(如 Al, S, O)及其后缀数字(如 Al2 → ('Al', 2));
- 嵌套展开:对括号内子式递归调用解析函数,并将外层系数乘入内部所有元素数量。
以下是完整、健壮且已验证的实现:
import re
def parse_atom(formula):
"""解析不含括号的原子序列,返回 [(element, count), ...]"""
# 匹配:大写字母+可选小写字母+可选数字(如 Mg, O2, Fe12)
atoms = re.findall(r'([A-Z][a-z]*)(\d*)', formula)
result = []
for elem, num_str in atoms:
count = int(num_str) if num_str else 1
result.append((elem, count))
return result
def parse_formula(formula):
"""
主解析函数:支持括号嵌套,返回嵌套元组结构。
示例:'Al2(SO4)3' → (('Al', 2), (('S', 1), ('O', 4)), 3)
注意:返回结构为 (base, multiplier) 或 (element, count),便于后续展开计算。
"""
if not formula:
return []
result = []
i = 0
while i 0:
if formula[j] == '(':
depth += 1
elif formula[j] == ')':
depth -= 1
j += 1
if depth != 0:
raise ValueError(f"Unmatched parenthesis in '{formula}'")
# 递归解析括号内内容
inner = formula[i+1:j-1]
# 获取括号后的数字(可能为空)
match = re.match(r'\d*', formula[j:])
multiplier_str = match.group(0) if match else ''
multiplier = int(multiplier_str) if multiplier_str else 1
# 将 (inner_parsed, multiplier) 作为整体加入
inner_parsed = parse_formula(inner)
result.append((inner_parsed, multiplier))
i = j + len(multiplier_str)
elif formula[i].isalpha():
# 提取连续的元素名(含大小写)
j = i + 1
while j <h3>关键说明与注意事项:</h3>
- 不依赖 re.findall 直接捕获嵌套:避免正则误匹配(如 ((A)2)3 中的括号干扰),改用手动索引+递归更可控;
- 括号匹配采用计数法:安全处理多层嵌套(如 Ca(OH)2 或 Fe(NO3)3);
- 返回结构设计为 (content, multiplier) 元组:便于后续「展开」操作——例如对 ((('S',1),('O',4)),3) 可遍历内部并乘以 3;
- 错误提示友好:对非法字符、括号不匹配、格式错误等抛出明确异常;
- 扩展建议:若需最终扁平化(如 Al2(SO4)3 → [('Al',2),('S',3),('O',12)]),可编写 flatten_and_multiply(parsed) 辅助函数,递归乘开所有嵌套系数。
该方案完全规避了 chempy、rdkit 等大型库,代码简洁(
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










