第1章 SMILES简介与基本规则
做化学信息学的人,早晚都会撞上 SMILES。我第一次接触这玩意儿是在八年前,当年接手一个化合物库的清洗脚本,老代码里全是“CCO”“CC(=O)O”这种东西。说实话,第一反应是懵的——这串字母到底怎么对应分子结构?
后来啃了几篇论文,自己动手写了个解析器,才算真正搞明白。SMILES(Simplified Molecular Input Line Entry System)说白了就是用一个字符串把分子结构“拍平”。它不像 molfile 那么啰嗦,也不像 InChI 那样自带校验和。简单,但坑也不少。
这节课我们就从头捋一遍 SMILES 的基本规则。你想想看,一个小字符串里要表达原子、键、分支、环、手性、同位素、电荷……不搞清楚规则,写出来的 SMILES 轻则解析失败,重则画出错误的分子。
1.1 原子表示——最基础的积木
SMILES 里的原子用元素符号直接写。比如碳原子写 C,氧写 O,氮写 N。注意,有机元素 Br、Cl、F、I 用两个字母,首字母大写,第二个小写。(我见过有人把溴写成 BR,结果解析器当成硼和什么乱七八糟的……)
氢原子在 SMILES 里通常不写出来,系统根据化合价自动补全。举个例:CCO 表示乙醇,两个碳一个氧,不写氢。
| 元素 | SMILES 写法 | 说明 |
|---|---|---|
| 碳 | C | 最常见 |
| 氧 | O | 羟基、羰基等 |
| 氮 | N | 胺、硝基等 |
| 氯 | Cl | 两个字母,第二个小写 |
| 溴 | Br | 同上 |
| 硫 | S | 注意别写成小写 |
C,但苯环上的碳用 c(小写)表示芳香性。这个后面会细讲。
1.2 单键、双键、三键与分支
键的连接方式很简单:
- 单键:直接写出相连的原子,或者用
-连接(不过大部分时候省略)。 - 双键:用
=写在两个原子之间。 - 三键:用
#。 - 分支:用圆括号
()把支链括起来,括号内的原子连接到前面那个原子上。
举个例子:乙醇的写法 CCO 其实可以理解为 C-C-O 单键链。丙酮呢?CC(=O)C——中间的碳上连了一个双键氧,那个括号说明氧是支链,不是链的一部分。
# 几种常见示例
乙醇 CCO
丙酮 CC(=O)C
乙酸 CC(=O)O
甲胺 CN
三键 C#N (乙腈)
这里有个坑:分支括号必须成对出现,而且括号里的原子个数不限。我曾在一个 3000 种化合物的库中发现有人写了 CC(=O(C)C) 这种错法——括号放错位置,结果解析出来的结构多了一个碳环。避坑指南:**括号里的内容表示取代基,只能挂在前面那个原子上,不能跨原子括。**
1.3 环——用数字标记开环
SMILES 里要表达环结构,不能真的画圈,而是用数字做标记。比如苯:c1ccccc1。数字 1 表示第一个标记点,后面再出现 1 就把前后两个原子连起来成环。
如果是脂肪环,比如环己烷:C1CCCCC1。数字可以是 0–99,但注意不要重复使用同一个数字表示不同环(除非被冒号分隔的离散数字,但基本规则中我们一般只用一个数字对应一个环)。
| 分子 | SMILES | 说明 |
|---|---|---|
| 苯 | c1ccccc1 | 小写c表示芳香碳 |
| 环丙烷 | C1CC1 | 三员环 |
| 环己烷 | C1CCCCC1 | 六员环 |
| 甲苯 | Cc1ccccc1 | 甲基连在苯环上 |
=,比如环戊二烯:C1=CC=CC1。我曾经见过有人写 C1=CC=CC1 结果多画了一个双键……嗯,其实就是格式不对。
1.4 手性——@ 与 @@
SMILES 用 @ 和 @@ 标记手性中心。放在手性原子符号后面。比如丙氨酸的两种手性异构体:
- L-丙氨酸:
N[C@@H](C)C(=O)O - D-丙氨酸:
N[C@H](C)C(=O)O
@ 表示逆时针方向(按原子顺序的透视式),@@ 表示顺时针。记住方法:@ 像一个逆时针的小箭头。我个人习惯在处理手性时先画出费歇尔投影,再转换成 SMILES,这样不容易搞混。
1.5 芳香性与小写字母
芳香性在 SMILES 里用小写元素符号表示。常见的是 c、n、o、s 等。比如吡啶:n1ccccc1。注意,芳香环中的双键不写,系统自动按离域键处理。
为什么不直接写大写的 C1=CC=CC=C1?因为那样写出来的是带交替单双键的环己三烯,不是真正的芳香苯环。解析器在芳香性处理后结构会不一样。所以,如果你想表达真实苯环,必须用小写 c。
c1ccccc1 → 苯,芳香性。C1=CC=CC=C1 → 环己三烯(非芳香性)。
1.6 同位素、电荷与原子详细表示
原子还可以带方括号表示同位素、电荷、额外氢。格式如下:
[13C] – 碳-13
[NH4+] – 铵离子
[OH-] – 氢氧根
[2H]CH3 – 氘代甲烷(甲基上的一个氢被氘取代)
方括号里的内容可以包含:
- 原子符号(大写首字母)
- 质量数(可选,放在元素符号前面,比如
[13C]) - 电荷(用
+、-表示,可加数字,比如[Fe+2]) - 氢原子个数(用
H加数字,比如[CH2]表示“碳上连两个氢”,但一般不这样写,因为 SMILES 会自动补氢)
我遇到过坑:写 [Fe+2] 时忘记写方括号,结果解析成 Fe 加一个数字 2,成了铁原子后面跟一个孤零零的数字。避坑:**所有带电荷、同位素、额外信息的原子都必须用方括号括起来。**
1.7 整个知识体系:SMILES 字符串到分子结构的映射
这一张图帮你理清从字符串到真实分子之间的转化流程。
从上面这张图可以看出,SMILES 的解析并不是一步到位的。系统需要依次处理原子、分支、环、补氢。我早期写解析器的时候漏掉了芳香性后处理,结果输出的苯环结构仍然显示为环己三烯,被导师批了一顿。
1.8 避坑指南——你可能会犯的错误
- 数字冲突:一个环编号不要被两对以上原子使用。比如多个环时,需要用
%加两位数字避免混淆。样例:C%12CC%12C%13CC%13表示两个不共享原子的环。 - 括号连续性:
CC(OC)表示甲氧基乙烷,但若写成CC(O(C))则多了一层括号,表示氧上再连一个碳?不,结构会乱。保持括号最小嵌套。 - 手性忘记写 @:如果你没写
@,默认不是手性中心。在药物分子里少写一个 @ 可能改变立体构型,活性可能就是天壤之别。
C1CN1C1),解析器报了环冲突。后来加了个校验脚本,提前检测环编号重复次数。
1.9 检验你的理解——几个小练手
下面这几个 SMILES 你试着在脑海中还原成结构,并判断正误。答案写在右下角空白处(当然这里只是文字)。
| SMILES | 目标分子 | 对/错? |
|---|---|---|
c1ccccc1 | 苯 | 正确 |
C1=CC=C(C=C1) | 苯? | 错误(大小写混了) |
CC(=O)O | 乙酸 | 正确 |
N[C@@H](C)C(=O)O | L-丙氨酸 | 正确 |