将字符动态插入到R中的字符串中

Inserting character dynamically into string in R

我想在邮政编码的中间插入一个“+”符号。邮政编码遵循 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"

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

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

这里有一些备选方案。如果 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"