SMILES规范:原子、键、分支、环的表示方法
SMILES 这门语言,说白了就是给分子画一条“线”。你把它写出来,别人(或程序)就能看懂。我刚入行那阵,总觉得这玩意跟化学式差不多,后来才发现——坑不少。一个括号放错位置,环编号重复,整个分子就变味了。
这一章,我们拆开来看:原子怎么标、键怎么连、分支怎么拐、环怎么封。我按自己日常写 SMILES 的习惯来组织,保证你学完就能上手写对。
核心原则:SMILES 的本质是用 ASCII 字符描述分子拓扑结构。它不关心坐标,只关心连接关系。
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 等。
检查清单:
- 所有非有机子集元素必须用方括号([ ])。
- 双键/三键显式写出符号(=, #)。
- 分支括号紧跟前一个原子,不能有空格。
- 环数字成对出现,顺序正确。
- 芳香环用小写字母。
- 立体手性用 @ 或 @@(如有需要)。
嗯,这一章内容不少。原子、键、分支、环,四个基础构件,组合起来就能描述绝大多数有机分子。你可以在脑子里试着写几个:乙醇 CCO,丙酮 CC(=O)C,四氢呋喃 C1CCOC1。多练几次,手感就有了。