是否可以使用正则表达式来解释 Excel 中支链烷烃的 IUPAC 名称?

问题描述 投票:0回答:1

我需要在 Excel 中使用 IUPAC(国际理论与应用化学联合会)名称计算出有关支链烷烃结构的信息。我已将问题分解为多个步骤,并且为每个步骤都包含了示例。任何步骤的帮助将不胜感激。我需要自动化该方法,因为我可能有数千个这样的名字需要处理。

第一步

我需要算出主链中的碳原子数。按照惯例,主链的名称出现在整体名称的最后。例如,2,2,3-三甲基辛烷中的主链是辛烷。正则表达式可以用来查找主链的名称,然后用来查找主链中的碳原子吗?下表提供了更多示例。

支链烷烃名称 主链 主链中的碳原子
2-甲基丙烷 丙烷 3
2-甲基丁烷 丁烷 4
3-乙基戊烷 戊烷 5
3-甲基己烷 己烷 6
4-丙庚烷 庚烷 7
2-甲基辛烷 辛烷值 8
3-乙基壬烷 壬烷 9
5-甲基癸烷 癸烷 10
6-丁基十一烷 十一烷 11
3-乙基十二烷 十二烷 12

Excel 中的自定义 UDF 可以命名为 MainChainRegex,=MainChainRegex(2,2,3-trimethyloctane) 将返回值 8。

第二步

我还需要计算出连接到每个主链碳原子上的侧链碳原子数。例如,3-乙基戊烷有两个侧链碳原子连接到主链中的第三个碳原子,请参见下图。 “乙基”术语是指含有两个碳原子的侧链。 “乙基”前面的“3-”告诉我们侧链连接到主链中的碳原子 3。

Excel 中的自定义 UDF 可以命名为 SideChainRegex 并且 =SideChainRegex(3-ethylpentane) 将在五个单元格中返回 0, 0, 2, 0, 0 的数组。主链中的碳原子数可用于调整数组的大小,数组中的第一个和最后一个值将始终为零。

第三步

当有多个侧链时,问题变得更加复杂。例如,2,2-二甲基丁烷有两条侧链,总共包含两个碳原子,请参见下图。 “甲基”术语是指含有一个碳原子的侧链。 “di”指的是这样一个事实,即有两个这样的侧链,这意味着我们需要在“二甲基”术语之前寻找两个数字。 “二甲基”前面的“2,2-”告诉我们两条侧链都连接到主链的第 2 个碳原子上。如果 Excel 中的自定义 UDF 被命名为 SideChainRegex,那么 =SideChainRegex(2,2-dimethylbutane) 将需要在四个单元格中返回一个 0、2、0、0 的数组——数组的大小同样取决于主链

第四步

更复杂的情况是存在不止一种类型的侧链。例如,5-ethyl-2,2-dimethylheptane 有两种不同类型的侧链,见下图。如果 Excel 中的自定义 UDF 名为 SideChainRegex,则 =SideChainRegex(5-ethyl-2,2-dimethylheptane) 需要在七个单元格中返回 0, 2, 0, 0, 2, 0, 0 的数组以总计连接到每个主链碳原子的侧链碳原子数。

下表提供了可能有用的更多信息。

学期 开学前要找多少个数字
2
3
利乐 4
五角星 5
六边形 6
7
八角 8
学期 侧链碳原子数
甲基 1
乙基 2
丙基 3
丁基 4
戊基 5
己基 6
庚基 7
辛基 8
excel vba chemistry
1个回答
1
投票

编辑:没有完全阅读您的问题并跳转到“碳原子总数”......您可以尝试获取 SMILES 并计算括号内/外的 C.

这里有一个使用 PubChem API 从 IUPAC 名称获取 MF 的例子:

Sub Tester()
    Debug.Print IUPACToSmiles("2,2-dimethylbutane")
End Sub

Function IUPACToSmiles(IUPAC As String) As String
    Const SVC_URL As String = "https://pubchem.ncbi.nlm.nih.gov/rest/pug/" & _
                    "compound/name/<iupac>/property/CanonicalSMILES/TXT"
    Dim json As Object, objhttp As Object
    
    Set objhttp = CreateObject("MSXML2.XMLHTTP")
    objhttp.Open "Get", Replace(SVC_URL, "<iupac>", URLEncode(IUPAC)), False
    objhttp.Send
    IUPACToSmiles = objhttp.responsetext
    Debug.Print IUPAC, IUPACToSmiles
End Function

Public Function URLEncode(StringVal As String, Optional SpaceAsPlus As Boolean = False) As String

  Dim StringLen As Long: StringLen = Len(StringVal)

  If StringLen > 0 Then
    ReDim result(StringLen) As String
    Dim i As Long, CharCode As Integer
    Dim Char As String, Space As String

    If SpaceAsPlus Then Space = "+" Else Space = "%20"

    For i = 1 To StringLen
      Char = Mid$(StringVal, i, 1)
      CharCode = Asc(Char)
      Select Case CharCode
        Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126
          result(i) = Char
        Case 32
          result(i) = Space
        Case 0 To 15
          result(i) = "%0" & Hex(CharCode)
        Case Else
          result(i) = "%" & Hex(CharCode)
      End Select
    Next i
    URLEncode = Join(result, "")
  End If
End Function

API参考:https://pubchem.ncbi.nlm.nih.gov/docs/pug-rest

要运行它(如果您改为选择 JSON 格式的输出选项),您需要从此处的项目导入 JsonConverter.bas 文件:https://github.com/VBA-tools/VBA-JSON并添加对 Microsoft 脚本运行时

的 VBA 项目引用
© www.soinside.com 2019 - 2024. All rights reserved.