在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。我错过了。谢谢你的接球。