SMILES 表示规则:环、电荷、同位素
SMILES 这玩意儿,说白了就是用一串字符把分子结构给「说」清楚。前两章我们讲了原子和键的基本写法,但真实分子哪有那么简单?环怎么闭合?电荷往哪放?同位素怎么标?这些都是绕不过去的坎。我个人习惯把这三种规则叫作 SMILES 的「三大金刚」——搞懂了它们,你就能表示绝大部分有机分子了。
我记得刚入行那会儿,第一次看到 C1CCCCC1 这种写法,心里直犯嘀咕:这数字是啥意思?后来才明白,原来环就是用数字来「配对」的。这一章,我就把环、电荷、同位素的表示规则掰开揉碎了讲清楚。
环结构:数字标记的艺术
SMILES 里没有直接的「画环」功能,它用了一个很巧妙的方法——数字标记。你想啊,一个环无非就是一条链在某个地方首尾相连。那怎么表示「首尾相连」这个动作呢?用相同的数字标在首尾两个原子上。
举个最经典的例子:环己烷。
C1CCCCC1
这里发生了什么?第一个碳后面跟着数字 1,最后一个碳后面也跟着 1。SMILES 解析器看到两个相同的数字,就知道这两个碳要连起来,形成一个六元环。说白了,数字就是「配对暗号」。
那如果有两个环怎么办?很简单,用不同的数字呗。
C1CC2CCCC2C1
这个例子是十氢化萘(decalin)。你看,数字 1 和 2 分别标记了两个环的起点和终点。解析器会根据数字配对来构建环的连接关系。
芳香环的写法也类似,只是原子用小写字母。比如苯:
c1ccccc1
小写的 c 表示芳香碳。这里六个芳香碳通过数字 1 闭合,形成一个芳香六元环。注意,芳香环的键是交替的单双键,但 SMILES 里不写出来,用小写字母就隐含了芳香性。
来,我们看个更复杂点的——吲哚:
c1ccc2c(c1)cc[nH]2
这个 SMILES 里既有苯环(c1ccc...c1),又有吡咯环(通过数字 2 标记)。两个环共享两个碳原子,形成了稠环结构。嗯,写这种 SMILES 的时候要特别小心配对的数字别搞混了。
电荷表示:方括号里的秘密
分子经常带电,尤其是离子化合物和反应中间体。SMILES 用方括号把电荷信息包起来,紧跟在原子符号后面。
基本格式就两种:
[+n] 表示正电荷
[-n] 表示负电荷
其中 n 是电荷数,如果是 1 可以省略不写。
来看几个例子:
| 物种 | SMILES | 说明 |
|---|---|---|
| 钠离子 | [Na+] |
正电荷,电荷数为 1,省略了数字 |
| 氯离子 | [Cl-] |
负电荷,电荷数为 1 |
| 镁离子 | [Mg+2] |
正二价,数字不能省 |
| 铁离子 | [Fe+3] |
正三价 |
| 氢氧根 | [OH-] |
负电荷在氧上,整体带一个负电 |
Na+(不加方括号),必须写成 [Na+]。我曾经在解析一个数据库时发现有人写了 Na+,结果解析器直接报错……那场面挺尴尬的。
还有一种特殊情况——自由基或未配对电子。用 . 或者 ^ 表示,不过用得不多。比如氧自由基可以写成 [O] 或 [O.],但主流写法是 [O] 加上一个未配对的电子暗示。
同位素标记:质量数带来的精确
同位素在化学中太重要了——质谱、核磁、同位素示踪,哪哪都离不开它。SMILES 里标记同位素的方式很直接:在原子符号前面加上质量数,一起放在方括号里。
格式很简单:
[质量数原子符号]
比如:
| 同位素 | SMILES | 说明 |
|---|---|---|
| 碳-13 | [13C] |
质量数 13,碳符号 C |
| 氘(重氢) | [2H] |
质量数 2,氢符号 H |
| 氚 | [3H] |
质量数 3 |
| 氮-15 | [15N] |
质量数 15 |
| 氧-18 | [18O] |
质量数 18 |
注意,同位素标记必须写在方括号里,即使这个原子在分子中只有这一个。比如氘代甲烷可以写成 [2H]C,而不是 2HC 或 H2C(那成甲烷了)。
[2H] 就行。比如苯环上的一个氘:c1cc([2H])ccc1。我在做代谢物鉴定项目时,这个写法几乎天天用。
三者合一:实战中的组合使用
真实分子往往同时包含环、电荷和同位素。这三者可以自由组合,都写在方括号里就行。顺序一般是:同位素 > 原子符号 > 电荷。
来看一个综合例子:
[13C]1CCCCC1[+1]
这个 SMILES 表示什么?1-位是碳-13 标记的环己烷正离子。拆开来看:
[13C]— 环上的第一个碳是碳-13 同位素1CCCCC1— 六元环,数字 1 标记闭环[+1]— 环上的某个位置带一个正电荷(这里指的是最后一个碳)
再复杂一点:氘代吡啶正离子。
[2H]c1cc[nH+]cc1
这个 SMILES 里有:氘([2H])、芳香环(小写 c 和数字 1)、正电荷(+ 在氮上)。你看,三种规则在同一个分子里和谐共存。
下面我用 Python 演示一下,如何用 RDKit 解析这类 SMILES 并提取信息:
from rdkit import Chem
smiles = "[13C]1CCCCC1[+1]"
mol = Chem.MolFromSmiles(smiles)
if mol:
for atom in mol.GetAtoms():
idx = atom.GetIdx()
symbol = atom.GetSymbol()
isotope = atom.GetIsotope()
charge = atom.GetFormalCharge()
print(f"原子 {idx}: {symbol}, 同位素={isotope}, 电荷={charge}")
else:
print("SMILES 解析失败")
输出结果大致是:
原子 0: C, 同位素=13, 电荷=0
原子 1: C, 同位素=0, 电荷=0
原子 2: C, 同位素=0, 电荷=0
原子 3: C, 同位素=0, 电荷=0
原子 4: C, 同位素=0, 电荷=0
原子 5: C, 同位素=0, 电荷=1
看到没?原子 0 的同位素是 13,原子 5 的电荷是 +1,完美对应了我们的 SMILES 输入。RDKit 把方括号里的信息解析得干干净净。
下面这张图总结了三种表示规则的核心逻辑和它们之间的关系:
避坑指南 — 我踩过的那些雷
做化学信息学这么多年,我在 SMILES 的环、电荷、同位素上栽过不少跟头。分享几个典型的坑,你们遇到了能绕开。
坑一:环数字搞混。 我曾经写一个含有三个环的分子,用了数字 1、2、3 来标记。结果写到最后发现数字 2 出现了三次,解析器直接蒙圈。后来学乖了,每写一个环就在纸上记一下数字用了没。
坑二:电荷忘加方括号。 这是新手最常见的错误。比如把钠离子写成 Na+,解析器会认为 + 是正电荷符号没错,但 SMILES 标准要求方括号。我见过一个数据库里几万条 SMILES 都是这种写法,后来写了个脚本批量加方括号才搞定。
坑三:同位素和电荷写反了顺序。 虽然解析器对顺序没那么敏感,但标准写法是 [质量数符号电荷],比如 [13C+1] 而不是 [C13+1] 或 [+1C13]。我刚开始写的时候经常写反,后来写多了才形成肌肉记忆。
C1CCCCC1 里的数字 1 和 C1CC1 里的数字 1 互不相干,各管各的。千万别把它们当成全局编号。
好了,这一章的内容就到这里。环、电荷、同位素这三个规则,是 SMILES 中处理复杂分子的基础。你想想看,如果没有数字标记法,开环分子和环状分子只能用不同的表示系统,那得多麻烦?方括号语法的设计也很聪明——把额外信息包起来,不干扰主干结构。搞懂了这些,你就能读懂和写出绝大多数有机分子的 SMILES 了。