SMILES规范:原子、键、分支、环的表示方法

SMILES 这门语言,说白了就是给分子画一条“线”。你把它写出来,别人(或程序)就能看懂。我刚入行那阵,总觉得这玩意跟化学式差不多,后来才发现——坑不少。一个括号放错位置,环编号重复,整个分子就变味了。

这一章,我们拆开来看:原子怎么标、键怎么连、分支怎么拐、环怎么封。我按自己日常写 SMILES 的习惯来组织,保证你学完就能上手写对。

核心原则:SMILES 的本质是用 ASCII 字符描述分子拓扑结构。它不关心坐标,只关心连接关系。

SMILES 表示法核心要素 原子表示 键表示 分支表示 环表示 串联成完整分子 原子决定元素,键决定连接方式, 分支和环处理复杂拓扑结构。 四者缺一不可。

1. 原子的表示——谁在分子里?

SMILES 里的原子,大部分直接用元素符号。比如 C 是碳,O 是氧。但有个特殊集合叫“有机子集”——B、C、N、O、P、S、F、Cl、Br、I。这些原子可以省略方括号,直接写符号。

C       # 甲烷 (CH4)
O       # 水 (H2O)
N       # 氨 (NH3)
Cl      # 氯化氢 (HCl)
Br      # 溴化氢 (HBr)

其他元素必须用方括号括起来,还要写明同位素、电荷、手性。比如:

[Na+]      # 钠离子
[Fe+2]     # 亚铁离子
[13C]      # 碳-13同位素
[NH4+]     # 铵离子

小心!有没有遇到过 CN 被解析成“C-N 单键连接”,而不是“氰根离子”?我刚开始犯过这种错——CN 是甲基与氮连接的分子,不是氰根。正确的氰根是 [C]#[N] 或直接 [CN-]。

芳香族原子用小写字母。比如 c 表示芳香碳,n 表示芳香氮。苯环就是 c1ccccc1。这个我后面讲环时会细说。

个人习惯:我写非有机子集时,即使可以省略方括号,也习惯带上——比如 [C] 而不是 C,尤其在做 SMILES 标准化时,统一格式能减少解析歧义。

2. 键的表示——怎么连?

键是 SMILES 里的“粘合剂”。默认是单键,可以什么都不写。其他键必须显式标出:

键类型 符号 示例 对应结构
单键(默认,可省略)CC乙烷
双键=C=C乙烯
三键#C#C乙炔
芳香键:c1ccccc1苯环
四键(罕见)$C$C某些有机金属

我记得有一次,同事写了一个 C=N,本来是想表示亚胺(C=N 双键),但 SMILES 解析器把它当成单键 + 一个“N”原子,因为等号前面没有用 = 显式标识?不对,实际上 C=N 中间的 = 就是双键——等等,我打错了。正确写法就是 C=N。你看,人写代码时候脑子一短路,容易把符号弄混。最经典的坑是:

  • 三键 # 写成 =?—— 不对,三键就是 #,双键才是 =。
  • 芳香键 : 在 SMILES 里一般只用在环闭合或特殊芳香结构中,日常很少单独出现在链式。
  • 单键可以省略,但为了更好地可读性,我建议在分支或环连接处显式加一个单键(比如 -),尤其在写复杂分子时。

避坑指南:我曾经把乙酸的 SMILES 写成 CC=O,结果解析出来是乙醛。为什么?因为 CC=O 只有 3 个原子:C-C=O,少了一个氧。正确的乙酸是 CC(=O)O。双键旁边的括号分支必须写对,否则差一个原子整个分子都变了。

3. 分支的表示——拐弯的艺术

分支用圆括号 () 括起来,表示从当前原子分出一条侧链。括号里的内容就是一个完整的子 SMILES。支持嵌套。

CC(C)C              # 异丁烷:C-C(C)-C
CC(=O)O             # 乙酸:C-C(=O)-O  
c1ccccc1C(=O)O      # 苯甲酸

括号紧跟在前面的原子后面,表示这个原子上挂了分支。注意:不要写成 C(C)C 这种,这在 SMILES 里表示的是环,不是分支——嗯,实际上 C(C)C 会被解析成 C-(C)-C?不对,SMILES 里如果括号后面直接跟括号,比如 C(C),表示从当前原子伸出一条侧链。但 C(C)C 是合法的,它表示第一个碳上连了一个甲基,然后这个碳又连了另一个碳(三个碳连成一条线?)。我画个图:

  • CC(C)C:主链 C-C-C,第二个碳上连一个甲基 → 异丁烷。
  • C(C)C:这不是分支,它表示 C(C)C,中间碳?其实 C(C)C 会被解析为 C-C-C,第一个碳有一个支链?等一下,标准写法应该是:C(C)C 表示第一个碳(C)上连了一个甲基 (C),然后这个碳又连了一个碳(C),结果就是三个碳成一条线?不对,因为第一个碳已经连了一个碳(括号里的),又连了第二个碳(括号后的),总共三个碳,第一个碳连了两个碳,所以还是三个碳呈 V 形?实际上 C(C)C 在 SMILES 里是合法的,它表示一种环?我把它理清:

分支与环的混淆:C(C)C 会被某些解析器当成三元环,因为括号后紧跟数字表示环编号?不,C1(C)C1 才是环。为了安全,分支一定要确保括号前有原子,括号后要么是继续主链,要么是环编号。我建议所有分支都显式写出主链原子顺序:CC(C)C 清晰明了。

分支可以多层嵌套:

CC(C)(C)C           # 新戊烷:C-C(C)(C)-C  
C(C(C)C)C           # 2-甲基丁烷?实际是 C-C(C)-C-C? 太乱,用标准写法

我个人习惯:写复杂分支时,先把主链写出来,再逐层加上括号。比如叔丁醇:CC(C)(C)O。主链 C-C-O,第二个碳上连两个甲基。

4. 环的表示——首尾相连

SMILES 里环用数字标记。当你想让两个原子连接成环时,第一个原子后面写一个数字(比如 1),第二个原子后面写同样的数字(1),表示它们之间连了一个键。数字可以重复使用,从 1 开始,一般不超过 9(虽然理论上可以更大,但容易乱)。

C1CCCCC1        # 环己烷:六个碳,首尾通过数字1连接  
c1ccccc1        # 苯:六个芳香碳  
C1=CC=CC=C1     # 1,3-环己二烯(双键位置)

开环数字的编号规则:沿着主链顺序,遇到第一个环标记时就给一个数字,然后继续走,走到环的另一个连接点再写同样的数字。多个环用不同数字:

C1CC2CC1C2      # 二环[2.2.1]庚烷(降冰片烷)

这个分子里有两个环:第一个环用数字1,第二个环用数字2。注意顺序不能乱。

常见错误 错误写法 正确写法 解释
环数字重复 C1C1 C1CC1 数字1出现两次但在相邻原子?实际上 C1C1 表示两个碳通过一个环连接?不,正确环丙烷是三个碳,所以 C1CC1:C1-C-C1,三个碳。
数字缺少配对 C1CC2CC2 C1CC2CC12 数字1只出现一次,没有闭合。
芳香环混用大小写 C1CCC1(苯?) c1ccccc1 芳香环必须用小写c;否则变成饱和环。

我的经验:写多环系统时,先画个图,标出每个环的起点和终点。比如金刚烷,我会先写主骨架,再逐步加上环数字。另外,尽量用不同的数字(1、2、3…)避免混淆。如果环数超过9,可以用百分号加两位数字:%10、%11。不过相信我,日常用到超过9个环的分子,你大概率在用专业软件,手写的机会不多。

环的立体化学也需要留意。比如环己烷的椅式构象,SMILES 本身不表达立体,但可以用 @ 和 @@ 表示手性。这个我们后续章节再展开。

5. 组合示例——一个真实的教训

我去年处理一批化合物数据时,有个同事写的 SMILES 是:

C1=CC=C(C=C1)C(=O)O

乍一看没问题:苯环连一个羧基。但仔细看,苯环用的是 C 大写(脂肪族),而不是 c 小写。这会导致什么问题?解析器认为这是一个环己烯结构,而非苯环!因为双键位置固定,实际上变成了 1,3-环己二烯的衍生物。正确的芳香写法是:

c1ccc(cc1)C(=O)O       # 或 c1ccccc1C(=O)O

所以,用大写 C 写苯环,等于强迫它变成单双键交替的非芳香体系。如果你需要计算芳香性,一定用小写 c 和 n 等。

检查清单:

  1. 所有非有机子集元素必须用方括号([ ])。
  2. 双键/三键显式写出符号(=, #)。
  3. 分支括号紧跟前一个原子,不能有空格。
  4. 环数字成对出现,顺序正确。
  5. 芳香环用小写字母。
  6. 立体手性用 @ 或 @@(如有需要)。

嗯,这一章内容不少。原子、键、分支、环,四个基础构件,组合起来就能描述绝大多数有机分子。你可以在脑子里试着写几个:乙醇 CCO,丙酮 CC(=O)C,四氢呋喃 C1CCOC1。多练几次,手感就有了。