【问题标题】:Inserting character dynamically into string in R将字符动态插入R中的字符串
【发布时间】:2017-01-06 12:34:03
【问题描述】:

我正在尝试在邮政编码中间插入一个“+”符号。遵循AA111AAAA11AA 模式的邮政编码。我希望在最终数字之前插入“+”,因此输出为 AA11+1AAAA1+1AA。我找到了一种使用stringr 的方法,但感觉有一种更简单的方法可以做到这一点,就像我目前正在做的那样。下面是我的代码。

pc <- "bt43xx"

pc <- str_c(
      str_sub(pc, start = 1L, end = -4L), 
      "+", 
      str_sub(pc, start = -3L, end = -1L)
      )

pc
[1] "bt4+3xx"

【问题讨论】:

    标签: r stringr


    【解决方案1】:

    这里有一些替代方案。如果pc 是标量或向量,则所有解决方案都有效。不需要任何包裹。其中 (3) 个似乎特别简短。

    1) 将所有内容 (.*) 匹配到最后一位 (\\d),然后将其替换为第一个捕获(即与第一组括号中的部分匹配) )、加号和第二次捕获(即匹配最后一位数字)。

    sub("(.*)(\\d)", "\\1+\\2", pc)
    

    2) 更短的替代方法是匹配一个数字后跟一个非数字,然后用加号替换它,然后匹配:

    sub("(\\d\\D)", "+\\1", pc)
    ## [1] "bt4+3xx"
    

    3) 这个比 (2) 还要短。它匹配最后 3 个字符,用加号替换匹配项,后跟匹配项:

    sub("(...)$", "+\\1", pc)
    ## [1] "bt4+3xx"
    

    4) 这将字符串拆分为单个字符,使用append 在适当的位置插入一个加号,然后将字符重新组合在一起。

    sapply(Map(append, strsplit(pc, ""), after = nchar(pc) - 3, "+"), paste, collapse = "")
    ## [1] "bt4+3xx"
    

    如果已知pc 是一个标量(如问题中的情况),则可以简化为:

    paste(append(strsplit(pc, "")[[1]], "+", nchar(pc) - 3), collapse = "")
    [1] "bt4+3xx"
    

    【讨论】:

      【解决方案2】:

      这个带有sub 和两个反向引用的正则表达式应该可以工作。

      sub("(\\d?)(\\d[^\\d]*)$", "\\1+\\2", pc)
      [1] "bt4+3xx"
      
      • \\d?匹配 1 或 0 个数字字符,0-9,并由 () 捕获。如果至少存在两个数字字符,它将匹配。
      • \\d[^\\d]* 匹配一个数字字符后跟所有非数字字符,并被 () 捕获
      • $ 将正则表达式锚定到字符串的末尾
      • "\\1+\\2" 将前两点中的匹配元素替换为自身和中间的“+”。

      【讨论】:

      • 这似乎不符合 OP 的需要,因为 + 在数字之后。我会做sub("(.*)(\\d\\D{2})", "\\1+\\2", pc)
      • 呃。我错过了。谢谢你的收获。
      【解决方案3】:
      sub('(\\d)(?=\\D+$)','+\\1',pc,perl=T)
      

      【讨论】:

        猜你喜欢
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多