【问题标题】:Isolate the first number after a letter with regular expressions用正则表达式隔离字母后的第一个数字
【发布时间】:2013-08-10 17:59:42
【问题描述】:

我正在尝试解析以 unicode 格式提供给我的化学式,格式为 C7H19N3

我希望隔离字母后第一个数字的位置,即7 位于索引 1,1 位于索引 3。这样我想在数字前面插入“sub”

我的前几次尝试让我循环尝试仅隔离第一个数字的位置,但无济于事。

我认为正则表达式可以做到这一点,虽然我很迷茫。

我的最终目标是输出公式Csub7Hsub19Nsub3,以便我的文本编辑器可以正确格式化它。

【问题讨论】:

    标签: python regex chemistry


    【解决方案1】:

    这个怎么样?

    >>> re.sub('(\d+)', 'sub\g<1>', "C7H19N3")
    'Csub7Hsub19Nsub3'
    

    (\d+) 是匹配 1 个或多个数字的 capturing group\g&lt;1&gt; 是在替换字符串中引用已保存组的一种方式。

    【讨论】:

    • +1,但匹配一个数字就足够了。事实上,匹配零位也可以是:re.sub(r'(?&lt;!\d)(?=\d)', 'sub', "C7H19N3")
    • @TimPietzcker 啊!你修改了你的正则表达式,我发布了完全相同的版本。
    • @AshwiniChaudhary 和 TimPietzcker +1 我更喜欢你的解决方案。 :)
    【解决方案2】:

    类似这样的前瞻和后瞻:

    >>> strs = 'C7H19N3'
    >>> re.sub(r'(?<!\d)(?=\d)','sub',strs)
    'Csub7Hsub19Nsub3'
    

    这匹配字符串中的以下位置:

    C^7H^19N^3   # ^ represents the positions matched by the regex.
    

    【讨论】:

      【解决方案3】:

      这是一个字面上匹配字母后的第一个数字:

      >>> re.sub(r'([A-Z])(\d)', r'\1sub\2', "C7H19N3")
      'Csub7Hsub19Nsub3'
      

      它在功能上是等效的,但可能更能表达意图? \1\g&lt;1&gt; 的较短版本,我还使用了原始字符串文字(r'\1sub\2' 而不是 '\1sub\2')。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多