【问题标题】:How to extract the last digits of strings using regular expressions?如何使用正则表达式提取字符串的最后一位?
【发布时间】:2020-09-21 07:43:47
【问题描述】:

我有一堆colnames

L_1_3
L_2_23
L_3_91
L_3_16

我想使用 _ 后面的最后一位数字将这些列名替换为新名称,如下所示:

3
23
91
16

我尝试过colnames(X) <- gsub("L_\\d\\d_", "", colnames(X)),它适用于末尾有两位数的字符串。我想要一个同时适用于一位数和两位数的。

谢谢!

【问题讨论】:

    标签: r regex replace names


    【解决方案1】:

    这是一个带有正向预测的选项:

    gsub(".+_(?=\\d+$)", "", X, perl = TRUE)
    [1] "3"  "23" "91" "16"
    

    【讨论】:

      【解决方案2】:

      如果这是适用于 2 位数字的模式,那么您唯一需要做的就是使用 ? 将其中一个数字设为可选

      L_\\d\\d?_
      

      Regex demo | R demo


      如果您必须匹配整个模式,您可以使用捕获组并使用锚点来断言字符串的开头^ 和结尾$,并在替换中使用组。

      ^L_\\d\\d?_(\\d+)$
      

      部分

      ^ 字符串开头 L_ 匹配 L_ \d 匹配一个数字 \d?匹配一个数字并重复 0 或 1 次 _ 匹配 _ (捕获组 1 \d+ 匹配一个数字并重复 1 次或多次 ) 关闭组 $ 字符串结尾

      Regex demo | R demo

      X <- c("L_1_3", "L_2_23", "L_3_91", "L_3_16")
      gsub("^L_\\d\\d?_(\\d+)$", "\\1", X)
      

      输出

      [1] "3"  "23" "91" "16"
      

      【讨论】:

        【解决方案3】:

        这是一个正则表达式。
        它得到任何东西,直到一个非数字后跟一个或多个数字的捕获组。并由捕获组替换。

        sub('.*[^[:digit:]]{1}([[:digit:]]+$)', '\\1', x)
        #[1] "3"  "23" "91" "16"
        

        一个适用于单个数字和两位数但既不多也不少的正则表达式

        sub('.*[^[:digit:]]{1}([[:digit:]]{1,2}$)', '\\1', x)
        #[1] "3"  "23" "91" "16"
        

        数据

        x <- scan(what = character(), text = '
        L_1_3
        L_2_23
        L_3_91
        L_3_16')
        

        【讨论】:

        • 我认为"^.*?(\\d+)$" 也可以,不是吗?
        • @AllanCameron 是的,作为答案发布,我会投票。比我的好多了。
        【解决方案4】:

        我们可以使用str_extract

        library(stringr)
        str_extract(X, "\\d+$")
        #[1] "3"  "23" "91" "16"
        

        数据

        X <- c("L_1_3", "L_2_23", "L_3_91", "L_3_16")
        

        【讨论】:

          【解决方案5】:

          尽量保持简单

          sub(".*_(\\d+$)", "\\1", X)
          [1] "3"  "23" "91" "16"
          

          【讨论】:

            【解决方案6】:

            我认为这可能是最简单的正则表达式:

            sub(".*\\_", "", tmp)
            

            【讨论】:

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