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 避坑指南:我经历过的那些立体化学大坑
做这行久了,踩过的坑真的不少。分享几个真实的教训:
-
我曾经因为 SMILES 顺序写反,导致
@/@@的含义反了。那次写一个手性硫原子,因为分支顺序不是按主链来的,结果
[S@@](=O)(=O)C实际上代表的是 R 构型,而不是我想要的 S 构型。后来我养成了习惯:先写主链,再写分支。 -
环状结构中的手性标记容易漏。
比如环己烷上的手性碳,很多人只写
C1CCCCC1完事。但如果该碳是手性的,必须显式标出[C@H]1或[C@@H]1。否则后续的分子模拟全部白做。 -
/和\在正则匹配时是转义字符。如果你用 Python 的
re模块处理 SMILES,就要写成r"C/C=C\\\\C"或者C/C=C\\\\C—— 这里的反斜杠需要转义。我当年写脚本时因为这个 bug 查了整整一天。
总结一下:
- 手性中心用
@(逆时针)和@@(顺时针) - 几何异构用
/(上)和\(下) - 书写顺序影响手性标记的含义
- 没有标记 = 构型未定义
- 解析库行为可能不一致,建议用规范化工具验证