【问题标题】:R - gsub a specific character of a specific positionR - gsub 特定位置的特定字符
【发布时间】:2015-05-10 12:24:04
【问题描述】:

我想删除变量的最后一个字符。 我想知道是否可以使用gsub 选择位置并删除该特定位置的字符。

在这个例子中,我想为我的 4 个变量删除最后一个数字,在 E 之后。

variables = c('B10243E1', 'B10243E2', 'B10243E3', 'B10243E4')
gsub(pattern = '[[:xdigit:]]{8}.', replacement = '', x = variables)

我以为我们可以使用命令

{}

为了选择一个特定的位置。

【问题讨论】:

    标签: regex r position gsub


    【解决方案1】:

    您可以通过捕获除最后一个以外的所有字符来做到这一点:

    variables = c('B10243E1', 'B10243E2', 'B10243E3', 'B10243E4')
    gsub('^(.*).$', '\\1', variables)
    

    解释:

    • ^ - 字符串的开始
    • (.*) - 除了换行符之外的所有字符
    • .$ - 字符串结尾 ($) 之前的最后一个字符(使用 . 捕获)。

    因此,如果您打算删除 final 字符,并且字符串不包含换行符,则可以使用此正则表达式。

    demo

    输出:

    [1] "B10243E" "B10243E" "B10243E" "B10243E"  
    

    仅替换第 8 个字符(这里是我在每个项目末尾添加 T 的示例):

    variables = c('B10247E1T', 'B10243E2T', 'B10243E3T', 'B10243E4T')
    gsub('^(.{7}).', '\\1', variables)
    

    sample program 的输出(不是每个项目末尾的ET,数字被删除):

    [1] "B10247ET" "B10243ET" "B10243ET" "B10243ET" 
    

    【讨论】:

      【解决方案2】:

      试试这些。第一个删除最后一个字符,第二个用 E 替换 E 及其后面的任何内容,第三个返回前 7 个字符,假设有 8 个字符,其余每个返回前 7 个字符。所有都是向量化的,即variables 可能是问题中的字符串向量。

      sub(".$", "", variables)
      
      sub("E.*", "E", variables)
      
      sub("^(.{7}).", "\\1", variables)
      
      sub("^(.{7}).*", "\\1", variables)
      
      substr(variables, 1, 7)
      
      substring(variables, 1, 7)
      
      trimws("abc333", "right", "\\d") # requires R 3.6 (currently r-devel)
      

      这是第三种解决方案中正则表达式的可视化:

      ^(.{7}).
      

      Debuggex Demo

      还有第四种解决方案中正则表达式的可视化:

      ^(.{7}).*
      

      Debuggex Demo

      【讨论】:

        【解决方案3】:

        如果您总是想在E 之后删除,您可以捕获它之后的所有内容并替换为E

        sub("E(.*)", 'E', variables)
        ## [1] "B10243E" "B10243E" "B10243E" "B10243E"
        

        或者,您可以使用正面向后看来计算 7 个字符,然后删除所有内容

        sub("(?<=.{7})(.)", "", variables, perl = TRUE)
        ## [1] "B10243E" "B10243E" "B10243E" "B10243E"
        

        【讨论】:

          【解决方案4】:
          library(stringr)
          str_sub("your String", 1, -2)
          

          可能比其他的慢,但更容易阅读。

          【讨论】:

            【解决方案5】:

            您也可以使用stringr 包中的str_sub

            library(stringr)
            variables = c('B10243E1', 'B10243E2', 'B10243E3', 'B10243E4')
            variables = str_sub (variables, start = 1, end = -2)
            

            输出:

            > variables
            [1] "B10243E" "B10243E" "B10243E" "B10243E"
            

            【讨论】:

              猜你喜欢
              • 2021-07-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多