我想在字符串中的特定位置插入一个额外的字符(或新字符串)。例如,我想在abcefg中的第四个位置插入d以获取abcdefg。
现在我使用:
old <- "abcefg"
n <- 4
paste(substr(old, 1, n-1), "d", substr(old, n, nchar(old)), sep = "")我可以为这个任务编写一个一行的简单函数,但我只是好奇是否有一个现有的函数来完成这个任务。
发布于 2012-12-14 00:05:42
您可以使用正则表达式和gsub来做到这一点。
gsub('^([a-z]{3})([a-z]+)$', '\\1d\\2', old)
# [1] "abcdefg"如果要动态执行此操作,可以使用paste创建表达式
letter <- 'd'
lhs <- paste0('^([a-z]{', n-1, '})([a-z]+)$')
rhs <- paste0('\\1', letter, '\\2')
gsub(lhs, rhs, old)
# [1] "abcdefg"根据DWin的评论,您可能希望它更通用。
gsub('^(.{3})(.*)$', '\\1d\\2', old)这样,任何三个字符都将匹配,而不仅仅是小写。DWin还建议使用sub而不是gsub。这样你就不必担心^了,因为sub只会匹配第一个实例。但我喜欢在正则表达式中显式表达,并且只在我理解它们并发现需要更通用的表达式时才转到更通用的表达式。
正如Greg Snow所指出的,您可以使用另一种形式的正则表达式来查找匹配:
sub( '(?<=.{3})', 'd', old, perl=TRUE )我还可以使用sprintf而不是paste0构建上面的动态gsub
lhs <- sprintf('^([a-z]{%d})([a-z]+)$', n-1) 或者他的sub正则表达式:
lhs <- sprintf('(?<=.{%d})',n-1)发布于 2017-08-17 22:44:25
stringi包再次施救!在所提出的解决方案中,最简单和优雅的解决方案。
stri_sub函数允许您提取字符串的一部分,并像这样替换它的一部分:
x <- "abcde"
stri_sub(x, 1, 3) # from first to third character
# [1] "abc"
stri_sub(x, 1, 3) <- 1 # substitute from first to third character
x
# [1] "1de"但是如果你这样做:
x <- "abcde"
stri_sub(x, 3, 2) # from 3 to 2 so... zero ?
# [1] ""
stri_sub(x, 3, 2) <- 1 # substitute from 3 to 2 ... hmm
x
# [1] "ab1cde"则不会删除任何字符,但会插入新字符。这不是很酷吗?:)
发布于 2012-12-14 00:18:49
@Justin的答案是,由于它的灵活性,我实际上会采用这种方式,但this也可能是一种有趣的方法。
您可以将字符串视为“固定宽度格式”,并指定要插入字符的位置:
paste(read.fwf(textConnection(old),
c(4, nchar(old)), as.is = TRUE),
collapse = "d")尤其是在使用sapply时的输出,因为您可以看到原始字符串作为“名称”。
newold <- c("some", "random", "words", "strung", "together")
sapply(newold, function(x) paste(read.fwf(textConnection(x),
c(4, nchar(x)), as.is = TRUE),
collapse = "-WEE-"))
# some random words strung together
# "some-WEE-NA" "rand-WEE-om" "word-WEE-s" "stru-WEE-ng" "toge-WEE-ther" https://stackoverflow.com/questions/13863599
复制相似问题