SMILES 表示规则:环、电荷、同位素

SMILES 这玩意儿,说白了就是用一串字符把分子结构给「说」清楚。前两章我们讲了原子和键的基本写法,但真实分子哪有那么简单?环怎么闭合?电荷往哪放?同位素怎么标?这些都是绕不过去的坎。我个人习惯把这三种规则叫作 SMILES 的「三大金刚」——搞懂了它们,你就能表示绝大部分有机分子了。

我记得刚入行那会儿,第一次看到 C1CCCCC1 这种写法,心里直犯嘀咕:这数字是啥意思?后来才明白,原来环就是用数字来「配对」的。这一章,我就把环、电荷、同位素的表示规则掰开揉碎了讲清楚。

核心要点: 环用数字标记开环与闭环的位置;电荷用方括号加符号表示;同位素在原子符号前加质量数。三者可以自由组合,放在方括号里一起搞定。

环结构:数字标记的艺术

SMILES 里没有直接的「画环」功能,它用了一个很巧妙的方法——数字标记。你想啊,一个环无非就是一条链在某个地方首尾相连。那怎么表示「首尾相连」这个动作呢?用相同的数字标在首尾两个原子上。

举个最经典的例子:环己烷。

C1CCCCC1

这里发生了什么?第一个碳后面跟着数字 1,最后一个碳后面也跟着 1。SMILES 解析器看到两个相同的数字,就知道这两个碳要连起来,形成一个六元环。说白了,数字就是「配对暗号」。

那如果有两个环怎么办?很简单,用不同的数字呗。

C1CC2CCCC2C1

这个例子是十氢化萘(decalin)。你看,数字 1 和 2 分别标记了两个环的起点和终点。解析器会根据数字配对来构建环的连接关系。

我的小建议: 环编号从 1 开始,依次递增就好。尽量不要跳号或重复使用同一个数字标记三个以上的环,虽然标准允许,但可读性会变差。我在项目中吃过这个亏——半年后回头看自己写的 SMILES,愣是看了半天才反应过来。

芳香环的写法也类似,只是原子用小写字母。比如苯:

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(那成甲烷了)。

实用技巧: 在药物代谢研究中,经常用氘代化合物来追踪代谢路径。写 SMILES 的时候,把要标记的氢换成 [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 环·电荷·同位素表示规则 环结构 数字标记法 数字配对确定环 示例:C1CCCCC1 数字 1 标记首尾 电荷表示 方括号 + 符号 [+n] 正电荷 [-n] 负电荷 n=1 时可省略 同位素标记 方括号 + 质量数 [质量数原子符号] 示例:[13C] [2H] 必须放在方括号里 综合示例:三者自由组合 [13C]1CCCCC1[+1] 环(数字1)+ 同位素(13C)+ 电荷(+1) 环的数字标记与方括号内的同位素/电荷是独立的 — 互不影响,但可以同时存在于同一个原子上

避坑指南 — 我踩过的那些雷

做化学信息学这么多年,我在 SMILES 的环、电荷、同位素上栽过不少跟头。分享几个典型的坑,你们遇到了能绕开。

坑一:环数字搞混。 我曾经写一个含有三个环的分子,用了数字 1、2、3 来标记。结果写到最后发现数字 2 出现了三次,解析器直接蒙圈。后来学乖了,每写一个环就在纸上记一下数字用了没。

坑二:电荷忘加方括号。 这是新手最常见的错误。比如把钠离子写成 Na+,解析器会认为 + 是正电荷符号没错,但 SMILES 标准要求方括号。我见过一个数据库里几万条 SMILES 都是这种写法,后来写了个脚本批量加方括号才搞定。

坑三:同位素和电荷写反了顺序。 虽然解析器对顺序没那么敏感,但标准写法是 [质量数符号电荷],比如 [13C+1] 而不是 [C13+1] 或 [+1C13]。我刚开始写的时候经常写反,后来写多了才形成肌肉记忆。

特别提醒: 环的数字编号只在本 SMILES 字符串内有效,不同分子之间的环数字没有关联。也就是说,C1CCCCC1 里的数字 1 和 C1CC1 里的数字 1 互不相干,各管各的。千万别把它们当成全局编号。

好了,这一章的内容就到这里。环、电荷、同位素这三个规则,是 SMILES 中处理复杂分子的基础。你想想看,如果没有数字标记法,开环分子和环状分子只能用不同的表示系统,那得多麻烦?方括号语法的设计也很聪明——把额外信息包起来,不干扰主干结构。搞懂了这些,你就能读懂和写出绝大多数有机分子的 SMILES 了。