在R中向字符串动态插入字符

在R中向字符串动态插入字符,r,stringr,R,Stringr,我试图在邮政编码的中间插入一个“+”符号。邮政编码遵循AA111AA或AA11AA的模式。我希望在最后一个数字之前插入“+”,以便输出AA11+1AA或AA1+1AA。我已经找到了一种使用stringr的方法,但感觉有一种更简单的方法可以做到这一点,这就是我目前的做法。下面是我的代码 pc <- "bt43xx" pc <- str_c( str_sub(pc, start = 1L, end = -4L), "+", str_sub(pc,

我试图在邮政编码的中间插入一个“+”符号。邮政编码遵循
AA111AA
AA11AA
的模式。我希望在最后一个数字之前插入“+”,以便输出
AA11+1AA
AA1+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"

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

sub("(\\d?)(\\d[^\\d]*)$", "\\1+\\2", pc)
[1] "bt4+3xx"
  • \\d?匹配1或0个数字字符(0-9),并由()捕获。如果至少存在两个数字字符,则它将匹配
  • \\d[^\\d]*匹配一个数字字符,后跟所有非数字字符,并由()
  • $将正则表达式锚定到字符串的末尾
  • “1”+“2”在前两点替换匹配元素,中间加上“+”。
      以下是一些替代方案。如果
      pc
      是标量或向量,则所有解决方案都有效。不需要软件包。其中(3)看起来特别简短

      1)将所有内容(
      *
      )匹配到最后一位(
      \\d
      ),然后将其替换为第一个捕获(即与第一组参数中的零件匹配)、一个加号和第二个捕获(即与最后一位匹配)

      2)另一种更短的方法是将一个数字与一个非数字进行匹配,并将其替换为一个加号,然后再匹配:

      sub("(\\d\\D)", "+\\1", pc)
      ## [1] "bt4+3xx"
      
      sub("(...)$", "+\\1", pc)
      ## [1] "bt4+3xx"
      
      3)这个比(2)还要短。它匹配最后3个字符,将匹配替换为加号,后跟匹配:

      sub("(\\d\\D)", "+\\1", pc)
      ## [1] "bt4+3xx"
      
      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"
      

      这似乎不符合OP的需要,因为+在数字后面。我会做
      sub((.*)(\\d\\d{2})”,“\\1+\\2”,pc)
      Ugh。我错过了。谢谢你的接球。