SMILES 基础:一行代码背后的化学语言

咱们做计算化学、结构生物学的人,每天打交道最多的东西,除了蛋白质 PDB,可能就是小分子了。你想想看,手动打开 ChemDraw 画一个苯环再保存成 mol2,一天能处理几个?几十个顶天了吧?

我早期做高通量虚拟筛选的时候,经常要处理几十万个小分子。要是每个都靠鼠标点,项目直接黄了。所以我个人习惯从源头抓起——SMILES 字符串。说白了,它就是化学结构的“身份证号”,一段紧凑的 ASCII 字符串,把分子结构描述得清清楚楚。

有了标准化的 SMILES,后续的 3D 生成、批次质控才能跑得动。这节课,我们就先把这个基础打牢。

1.1 SMILES 到底是什么

SMILES 的全称是 Simplified Molecular Input Line Entry System,1988 年由 David Weininger 提出。它的核心思路很简单:用深度优先的方式,把分子图遍历一遍,转换成一行字符串。

我记得有一次跟新来的同事对接,他抱怨 SMILES 看着像乱码。我让他把 CC(=O)O 拆开看:

  • C — 第一个碳原子(甲基)
  • C — 第二个碳原子(羰基碳)
  • (=O) — 括号表示分支,这个碳上连了一个双键氧
  • O — 分支结束后,继续写羟基

顺着这个逻辑走一遍,你就能在脑子里画出乙酸的骨架。这就是 SMILES 的底层逻辑。

1.2 原子与键的编码规则

原子符号直接用元素周期表缩写。但有几个“潜规则”,新手特别容易踩坑。

元素 SMILES 写法 默认氢原子数 备注
碳 C 4 价补全 有机子集元素有默认价态
氮 N 3 价补全 注意芳香氮还是脂肪氮
氧 O 2 价补全 羰基氧必须显式写双键
卤素 F, Cl, Br, I 1 价补全 直接写元素符号即可
芳烃碳 c 1 价补全 小写字母表示芳香性

键的连接规则:

  • 单键:可以省略不写,比如 CC 就是乙烷
  • 双键:用 = 表示,比如 C=C 是乙烯
  • 三键:用 # 表示,比如 C#C 是乙炔
  • 离子键/配位键:用 . 连接,表示拆开的片段,比如 [Na+].[Cl-]
避坑指南:我曾经批量处理过一个数据库,结果发现几千个分子结构都少了一个氢——因为默认价态补全是基于“有机子集”规则的。如果你处理的是带高价态的元素(比如硫、磷),一定要用方括号显式写出来,比如 [S+2] 或 [P+5],不然解析器会直接报错或生成错误结构。

1.3 常见官能团的 SMILES 写法

掌握几个基础模板,遇到复杂结构时直接往上套就对了。

官能团 SMILES 示例 说明
羟基 CCO 乙醇,-OH 直接写在末尾
羰基 CC(=O)C 丙酮,括号表示分支
羧基 CC(=O)O 乙酸,先写双键氧,再写羟基
胺基 CCN 乙胺,伯胺直接连
苯环 c1ccccc1 数字 1 表示成环位置
硝基 [O-][N+](=O) 电荷必须用方括号显式标明

手性中心的处理:

SMILES 用 @ 和 @@ 来表示手性。一个小技巧:@ 表示逆时针方向,@@ 表示顺时针方向。我个人习惯在写手性中心时,把四个取代基按照 CIP 优先规则排好顺序,这样基本不会出错。

# L-丙氨酸 (S-构型)
[NH3+][C@@H](C)C(=O)[O-]

# D-丙氨酸 (R-构型)
[NH3+][C@H](C)C(=O)[O-]

1.4 从 SMILES 到分子图的底层逻辑

咱们做批次转化的时候,解析器其实做了下面这几步。我把它画成了一张流程图,你对照着看会清楚很多:

SMILES 到 3D 结构解析流程 图 1:SMILES 字符串到分子图的解析流程 SMILES 字符串 词法分析器 原子节点列表 分支与成环处理 完整分子图 从左到右逐一扫描 用数字标签识别环 用括号处理分支

解析器先从左边第一个字符开始看,遇到原子符号就创建节点,遇到括号就知道是分支,遇到数字就去找对应的环闭合位置。最后我们会得到一个完整的分子图——这个图里包含了所有原子和连接关系,接下来才能去做 3D 构象生成。

我的经验之谈:在写批次脚本的时候,我习惯先用 RDKit 的 MolFromSmiles() 试解析一遍,能生成分子对象 mol 才往下走,解析不了的就直接过滤出来单独处理。这样可以避免在 3D 生成阶段因为一个坏结构导致整个批次卡死。
小技巧:处理金属有机配合物时,不要直接写配位键。SMILES 规范里没有原生的配位键语法。我个人习惯用 [M] 代表金属中心,然后用 . 把配体拆开写,最后在生成 3D 坐标时再用约束条件拼接。