将字符动态插入到R中的字符串中
Inserting character dynamically into string in R
我想在邮政编码的中间插入一个“+”符号。邮政编码遵循 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"
这个带有 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"
我想在邮政编码的中间插入一个“+”符号。邮政编码遵循 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"
这个带有 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"