2. SMILES表示法:原子、键、分支
SMILES,全称是 Simplified Molecular Input Line Entry System。说白了,就是一种用一行字符串描述分子结构的语法。我当年第一次接触时,觉得这东西像化学界的七言绝句——规则简单,但表达能力惊人。
这一章,我们就把它拆成原子、键、分支三块来讲。每个部分我都会结合自己踩过的坑来聊,希望能帮你少走些弯路。
2.1 原子表示
SMILES里,原子符号直接用元素周期表的大写字母表示。单字母的直接写,比如 C、N、O。双字母的,第二个字母小写,比如 Cl、Br。嗯,这里有个细节:Se、Si 也是小写第二字母。我曾经在一个项目里把 Co(钴)写成了 CO(一氧化碳),结果解析出来的分子完全不对——SMILES里 CO 是碳-氧单键相连,不是钴元素。避坑指南:元素符号区分大小写,双字母必须首字母大写、次字母小写。
芳香原子用小写字母表示,比如 c 代表苯环上的碳,n 代表吡啶环上的氮。这部分我们后续章节会详细展开。
| 原子 | SMILES 符号 | 说明 |
|---|---|---|
| 碳 | C | 脂肪碳(sp3) |
| 氮 | N | 脂肪氮 |
| 氧 | O | 脂肪氧 |
| 氯 | Cl | 双字母,l 小写 |
| 溴 | Br | 双字母,r 小写 |
| 芳香碳 | c | 小写代表芳香性 |
| 芳香氮 | n | 小写代表芳香性 |
我的习惯:写 SMILES 前,先判断元素是主族还是过渡金属。过渡金属如 Fe、Cu 在标准 SMILES 中也能直接写,但很多解析器对金属配位键支持不完整。如果只处理有机分子,这部分可以忽略。
2.2 键的类型
键的表示很直观:单键直接写原子符号,不写任何键符;双键写等号 =;三键写井号 #。比如乙烯就是 C=C,乙炔就是 C#C。
那么四键呢? 标准 SMILES 不直接支持四键。如果需要表示,用四键符号 $,但极其罕见。我做了十年化学信息学,只遇到过两次四键——都是某些过渡金属-金属配合物。
芳香键不显式画出,而是用小写原子自动隐含。这也意味着:当你写一个大写的 C,它永远是脂肪碳;写小写的 c,它自动进入芳香系统。我当初犯过一个错:想把苯环写出来,但用了大写 C 加单双键交替——结果解析器把它当作环己三烯,而不是芳香苯。记住,SMILES 里 c1ccccc1 才是真正的苯。
另外,键的方向性不重要。比如 C=C 和 C=C 反过来是一样的。但有些扩展规范(如 Isomeric SMILES)支持顺反异构,用 / 和 \ 表示键的走向。这部分属于进阶内容,我们后面再讲。
注意:有些教材或在线工具会显示 “单键用 - 表示”,这在标准 SMILES 中其实是可选的。你自己写单键时可以不加,但解析器遇到 - 也能接受。我个人建议初学时就不加短线,少一个字符就少一点眼花的概率。
2.3 分支语法与规则
分支是 SMILES 最有用的特性之一。它用圆括号 () 把侧链包裹起来,并附着在主干原子后面。比如异丙醇 CC(C)O 表示:一个碳连着两个甲基(括号内是第二个甲基),再接一个羟基。你想想看,如果没有括号,我们怎么表示支链?只能通过画图了。
括号可以嵌套:CC(C)(C)O 表示叔丁醇(三个甲基在同一碳上)。也就是说,一个括号内的内容可以视为一个“子结构”,它自己又可以包含其他括号。
实际项目里,我最烦的坑是:括号位置放错。举个例子:OC(C)C 和 OCC(C)C 是完全不同的分子——前者是异丙醇,后者是丁醇。我曾经在生成药物分子库时,因为一个括号位置错误,导致一万个分子全部生成成同分异构体,直到验证时才发现。避坑指南:写长 SMILES 时,先用纸笔画一下结构,再用括号对应侧链位置。
分支还有一个隐藏规则:括号里不能是孤立原子,必须是一个完整的子图。比如 C(O)C 合法,但 C(O 缺少右括号,语法错误。C(O)(C) 也合法,表示两个分支在同一原子上。
另外,分支的顺序不影响拓扑等价性。比如 CC(C)O 和 CC(O)C 其实表示同一个分子?不对,前者第二个碳上挂了甲基和羟基,后者第一个碳上挂了甲基,第二个碳上挂了羟基。记住:括号的位置决定连接点,不能随便移。
核心规则总结:
- 括号必须成对出现,且正确嵌套。
- 括号内的子图必须是一个完整的、合法的 SMILES 片段。
- 分支从主干原子的右手边开始连接。
- 多个分支在同一原子上时,直接后接多个括号,如
C(O)(O)O。
最后,我们用一个完整的示例把原子、键、分支串起来。下面这个 SMILES 代表阿司匹林(乙酰水杨酸):
CC(=O)Oc1ccccc1C(=O)O
解析: CC(=O)O 是乙酰基(两个碳,第一个碳双键氧,再连一个氧);c1ccccc1 是苯环;C(=O)O 是羧基。整个分子是个醚键连接。
我建议你手写这段 SMILES,对着结构图验证一遍。相信我,自己写一次胜过看十遍。
你可以这样练:找十个常见药物分子(比如对乙酰氨基酚、布洛芬),手写它们的 SMILES,然后用 openbabel 或 rdkit 转成 2D 结构图验证。只要一次,你就能记住分支和原子表示的直觉。我当年就是这样入门的。