4. SMILES 中的立体化学:手性与构型怎么表示

好,我们接着聊。前面我们写的 SMILES 都是平面结构,但分子是有三维构型的。你想想看,同样的原子连接方式,空间上翻个面,可能就是完全不同的两种化合物——药效、毒性天差地别。

SMILES 怎么处理这个事?说白了,它用一套简洁的符号把立体信息编码进来。我今天就把这套规则讲透。

4.1 最基本的问题:顺反异构和四面体手性

立体化学里最常见的两种场景:一个是双键/环上的顺反异构,另一个是四面体碳上的手性中心。我们先看后者。

对于四面体手性碳,SMILES 用 @ 和 @@ 来区分两种对映体。这两种符号放在手性原子后面,表示该原子上的取代基排列方式。

我个人习惯把 @ 叫“逆时针”,@@ 叫“顺时针”。记住这个就好办了。

核心规则:手性原子后接 @ 表示逆时针排序,@@ 表示顺时针排序。排序依据是连接在手性原子上的各基团的优先级顺序。

举个具体例子。L-丙氨酸和D-丙氨酸,化学式一模一样,但旋光性相反。用 SMILES 写出来区别在哪?

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

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

看仔细了。两个 SMILES 唯一的不同就是 @ 和 @@。我在项目中遇到过好几次,有人把 @@ 写反了,结果对接出来的分子构型完全错了,白跑了一周的计算。

4.2 编号规则:从哪个原子开始数?

你可能会问:SMILES 是线性字符串,它怎么知道“排序”是从哪个原子开始?

答案藏在编码顺序里。SMILES 对立体化学的处理,依赖一个隐含的编号规则:

  • 先写出来的原子,优先级默认高于后写的
  • 对于手性碳,四个连接基团的顺序由它们在 SMILES 字符串中出现的顺序决定
  • 括号内的分支和环闭合也参与排序

嗯,这里要注意。SMILES 的立体化学不是基于Cahn-Ingold-Prelog (CIP) 规则,而是基于字符串拓扑顺序。所以同一个分子,如果 SMILES 书写顺序不同,即使 @/@@ 相同,实际构型也可能不同。

我建议你写手性分子时,尽量保持固定的书写习惯——比如主链先写,分支后写。这样 @/@@ 的含义才稳定。

4.3 几何异构:双键的顺反怎么标

双键不能自由旋转,因此顺反异构也需要标记。SMILES 用 / 和 \ 来表示。

/ 表示双键这一侧的原子在“上”方,\ 表示在“下”方。这里的上下是相对的,由双键两端的书写顺序决定。

举个例子,2-丁烯的顺反异构:

# 顺式-2-丁烯 (Z-构型)
C/C=C\C

# 反式-2-丁烯 (E-构型)
C/C=C/C

看到没有?双键两侧的甲基方向,通过 / 和 \ 来控制。

小技巧:你可以把 / 想象成“上斜杠”,\ 是“下斜杠”。双键左侧的原子固定,右侧原子用斜杠表示它与左侧的上下关系。上斜杠 = 在上方,下斜杠 = 在下方。

这里有个坑。有些解析库对 / 和 \ 的处理不一样。我以前写过一段脚本,用 RDKit 解析 SMILES 时,发现 C/C=C\C 和 C\C=C/C 被当成了同一个分子——因为 RDKit 会把构型重新规范化为标准形式。但实际上,如果严格按照 SMILES 规范,这两个表示的是互为对映体的两种构型。

注意:不是所有化学信息学库都100%支持立体化学的完整语义。使用开放工具时,建议用规范化的 SMILES 或 IsomericSMILES 来保持一致性。切勿假设所有解析器对 / 和 \ 的解释完全一致。

4.4 手性池与多个手性中心

复杂的分子往往有多个手性中心。每个手性中心都要单独标记,顺序跟在原子后面即可。

我拿类固醇举个例子:

# 胆固醇的简化 SMILES(不完整,仅展示多手性标记)
C[C@H]1CC[C@@H]2[C@@]3(C)CC[C@H](O)C3[C@H](C)CC[C@@]12C

这里 [C@H] 和 [C@@H] 交替出现。每个手性中心独立标记,互不干涉。

你想想看,如果一个分子有 8 个手性中心,那它的立体异构体数量就是 2^8 = 256 种。如果不写 @/@@,默认情况下这个 SMILES 属于哪种构型?答案是——未定义。解析器通常把它当作外消旋体或随机构型处理。

所以,做手性药物的时候,千万不要偷懒省略 @/@@ 标记。

4.5 表格速查:@、@@、/、\ 规则总结

符号 位置 含义 案例
@ 手性中心原子后 逆时针排序(相对字符串顺序) [C@H](O)C
@@ 手性中心原子后 顺时针排序(相对字符串顺序) [C@@H](O)C
/ 双键一侧的原子前/后 表示连接方向为“上” /C=C\C
\ 双键一侧的原子前/后 表示连接方向为“下” \C=C/C
无标记 任何位置 立体化学未定义 C1CCCCC1(环己烷无手性标记)

4.6 避坑指南:我经历过的那些立体化学大坑

做这行久了,踩过的坑真的不少。分享几个真实的教训:

  1. 我曾经因为 SMILES 顺序写反,导致 @/@@ 的含义反了。

    那次写一个手性硫原子,因为分支顺序不是按主链来的,结果 [S@@](=O)(=O)C 实际上代表的是 R 构型,而不是我想要的 S 构型。后来我养成了习惯:先写主链,再写分支。

  2. 环状结构中的手性标记容易漏。

    比如环己烷上的手性碳,很多人只写 C1CCCCC1 完事。但如果该碳是手性的,必须显式标出 [C@H]1 或 [C@@H]1。否则后续的分子模拟全部白做。

  3. / 和 \ 在正则匹配时是转义字符。

    如果你用 Python 的 re 模块处理 SMILES,就要写成 r"C/C=C\\\\C" 或者 C/C=C\\\\C —— 这里的反斜杠需要转义。我当年写脚本时因为这个 bug 查了整整一天。

总结一下:

  • 手性中心用 @(逆时针)和 @@(顺时针)
  • 几何异构用 /(上)和 \(下)
  • 书写顺序影响手性标记的含义
  • 没有标记 = 构型未定义
  • 解析库行为可能不一致,建议用规范化工具验证
SMILES 立体化学知识体系 SMILES 立体化学 四面体手性 几何异构(双键/环) 多手性中心 / 未定义 @ 逆时针 @@ 顺时针 字符串顺序 / 上斜杠 \ 下斜杠 E/Z 对应 独立标记 未定义 = 外消旋 解析库差异 ⚠ 核心原则 • 立体化学基于字符串拓扑顺序,而非 CIP 规则 • 无标记 = 构型未定义,解析器可自由解释