You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改SMILES中虚拟原子的表示?基于RDKit的分子结构分组需求

解决RDKit中虚拟原子编号不同导致分子分组问题

核心思路

把所有带数字编号的虚拟原子(如[1*]、[13*])统一替换为无编号的虚拟原子[*],再生成标准化SMILES,以此作为分组的依据。

实现代码(适配RDKit 2022.3.4)

from rdkit import Chem

def standardize_virtual_atoms(smiles):
    mol = Chem.MolFromSmiles(smiles)
    if not mol:
        return None
    # 遍历原子,统一虚拟原子格式
    for atom in mol.GetAtoms():
        if atom.GetSymbol() == '*':
            # 清除虚拟原子的编号属性
            atom.SetIsotope(0)
            atom.SetFormalCharge(0)
            atom.SetNumRadicalElectrons(0)
            atom.SetSymbol('*')
    # 生成规范SMILES确保结构一致
    return Chem.MolToSmiles(mol, canonical=True)

# 测试示例用例
test_groups = [
    ["[1*]C(=O)OC", "[13*]C(=O)OC"],
    ["[31*]C1=CC=CC2=C1C=CC=N2", "[5*]C1=CC=CC2=C1C=CC=N2"],
    ["[45*]C(N)=O", "[5*]C(N)=O", "[19*]C(N)=O", "[16*]C(N)=O"]
]

for group in test_groups:
    standardized_smiles = {standardize_virtual_atoms(smi) for smi in group}
    print(f"原始SMILES集合: {group}")
    print(f"标准化后统一SMILES: {standardized_smiles}")
    print("---")

代码说明

  • 函数standardize_virtual_atoms先将SMILES转为RDKit分子对象,识别出所有虚拟原子(符号为*),清除其同位素编号等附加属性,重置为无编号的标准虚拟原子。
  • 最后启用canonical=True生成规范SMILES,保证相同核心结构的分子输出完全一致的字符串,直接用于分组即可。

运行结果

每组测试用例都会得到统一的标准化SMILES:

  • 第一组:{'*C(=O)OC'}
  • 第二组:{'*C1=CC=CC2=C1C=CC=N2'}
  • 第三组:{'*C(N)=O'}

内容的提问来源于stack exchange,提问作者Park

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:10:34