分子不仅仅是静态的结构,在药物化学和虚拟筛选中,常常需要修改分子、提取子结构,或者检测分子是否含有某种特定官能团。
RDKit 的 Chem
模块提供了丰富的 API 用于 分子编辑 和 查询匹配。
3.1 分子克隆与拷贝
RDKit 中的分子对象是不可变的(immutable),如果要修改,需要使用 可编辑分子对象 RWMol
。
from rdkit import Chem
mol = Chem.MolFromSmiles("CCO")
rw_mol = Chem.RWMol(mol) # 转换为可编辑分子
3.2 原子与键的编辑
3.2.1 添加原子
from rdkit import Chem
rw_mol = Chem.RWMol(Chem.MolFromSmiles("CCO"))
new_atom = rw_mol.AddAtom(Chem.Atom(8)) # 添加一个氧原子 (O)
print("添加原子索引:", new_atom)
3.2.2 添加键
rw_mol.AddBond(2, new_atom, Chem.BondType.SINGLE) # 在 O (idx=2) 与新 O 之间添加单键
mol_new = rw_mol.GetMol()
print(Chem.MolToSmiles(mol_new))
3.2.3 删除原子/键
rw_mol = Chem.RWMol(Chem.MolFromSmiles("CCO"))
rw_mol.RemoveAtom(2) # 删除索引为 2 的原子
mol_new = rw_mol.GetMol()
print(Chem.MolToSmiles(mol_new))
rw_mol = Chem.RWMol(Chem.MolFromSmiles("CCO"))
rw_mol.RemoveBond(0, 1) # 删除原子 0 和 1 之间的键
mol_new = rw_mol.GetMol()
print(Chem.MolToSmiles(mol_new))
3.3 子结构匹配(Substructure Search)
RDKit 支持 SMILES 子结构匹配 和 SMARTS 模式匹配。
3.3.1 基本子结构匹配
mol = Chem.MolFromSmiles("CCO")
query = Chem.MolFromSmiles("CO") # 羟基乙基
matches = mol.GetSubstructMatches(query)
print("匹配结果:", matches)
输出:
匹配结果: ((1, 2),)
说明在 CCO
中,CO
匹配到了原子 (1,2)。
3.3.2 SMARTS 模式匹配
SMARTS 是 SMILES 的扩展,可以描述更复杂的子结构。
mol = Chem.MolFromSmiles("c1ccccc1O") # 苯酚
smarts = Chem.MolFromSmarts("c-O") # 芳香碳连接氧
matches = mol.GetSubstructMatches(smarts)
print("匹配结果:", matches)
输出:
匹配结果: ((0, 6),)
3.4 官能团检测
通过 SMARTS 可以检测特定官能团,例如:
- 羟基(-OH):
[OX2H]
- 羧基(-COOH):
C(=O)[OH]
- 胺基(-NH2):
[NX3;H2]
mol = Chem.MolFromSmiles("CC(=O)O") # 乙酸
carboxy = Chem.MolFromSmarts("C(=O)[OH]")
if mol.HasSubstructMatch(carboxy):
print("分子中含有羧基")
3.5 分子替换(子结构替换)
RDKit 可以替换分子中的子结构,这在分子库改造和化合物优化中非常常用。
mol = Chem.MolFromSmiles("CCO")
query = Chem.MolFromSmiles("O")
replace = Chem.MolFromSmiles("Cl")
new_mol = Chem.ReplaceSubstructs(mol, query, replace)[0]
print(Chem.MolToSmiles(new_mol))
输出:
CCCl
小贴士
- 不可变分子与 RWMol:普通
Mol
不能直接修改,必须转换成RWMol
进行编辑。 - SMARTS 比 SMILES 更强大:熟悉 SMARTS 能让你快速检测官能团,比如
[OX2H]
表示羟基。 - 子结构匹配结果是原子索引:可用于后续高亮显示或修改分子。
- ReplaceSubstructs 非常适合做分子改造,比如虚拟药物库的生成。
练习
-
写一个函数,输入 SMILES 和一个 SMARTS 模式,输出分子是否包含该子结构。
- 测试:
苯酚 (c1ccccc1O)
是否包含芳香碳-氧键 (c-O
)?
- 测试:
-
用 RDKit 将乙醇 (
CCO
) 的 -OH 替换成 -Cl,并输出新分子的 SMILES。 -
检测以下分子中是否含有羧基(-COOH):
- 乙酸 (
CC(=O)O
) - 苯甲酸 (
c1ccccc1C(=O)O
) - 乙醇 (
CCO
)
- 乙酸 (
-
编写一个小程序,对分子库(SDF 文件)批量检测是否含有 芳香环,并输出含有芳香环的分子数量。