如何修改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
相关产品推荐
相关产品推荐

