我是R的新手。这可能是一件非常简单的事情,但我无法弄明白。
说,我有一个字符串如下:
This is an example string.
现在我想按如下方式进行:
This is an (example/sample) string.
我知道要进行更改的位置。 (给定字符串中的第12个字符)。
我有很多字符串,我需要执行类似的操作。
答案 0 :(得分:2)
我想我不明白这个问题,但如果我这样做,你可以在这里使用gsub
:
x <- "This is an example string."
gsub("example", "(example/sample)", x)
## [1] "This is an (example/sample) string."
答案 1 :(得分:1)
这是一个带有正则表达式的解决方案:
# the string
s <- "This is an example string."
# the position of the target's first character
pos <- 12
# create a regular expression
reg <- paste0("^(.{", pos - 1, "})(.+?\\b)(.*)")
# [1] "^(.{11})(.+?\\b)(.*)"
# modify string
sub(reg, "\\1\\(\\2/sample\\)\\3", s)
# [1] "This is an (example/sample) string."
答案 2 :(得分:0)
这是使用lookbehind的另一种正则表达式解决方案:
s <- "This is an example string."
pos <- 12
replacement <- '(example/sample)'
sub(sprintf('(?<=^.{%s})\\S*\\b', pos-1), replacement, s, perl=TRUE)
## [1] "This is an (example/sample) string."
Lookbehind (?<=x)
很有用,因为它内的正则表达式是模式的一部分,但不会成为匹配的一部分(因此我们不必捕获它们并在以后替换它们)。上面的模式说:“字符串的开头,后跟11个字符,前面有零个或多个非空白字符,后跟一个单词边界。只有非空白字符被replacement
替换。
<强>更新强>
另一种方法是使用strsplit
创建单词矢量,然后识别感兴趣字符(例如第12个字符)的矢量中的位置,随后用新单词替换该元素。这比正则表达式方法慢一点,但可以直接请求多个替换(在多个字符位置)。例如:
f <- function(string, pos, new) {
s <- strsplit(string, '\\s')[[1]]
i <- findInterval(pos, c(gregexpr('(?<=\\b)\\w', string, perl=TRUE)[[1]],
nchar(string)))
s[i] <- mapply(sub, s[i], patt='\\b[[:alnum:]-]+\\b', repl=new, perl=TRUE)
paste0(s, collapse=' ')
}
f('This is an example string.', c(12, 20), c('excellent', 'function'))
## [1] "This is an excellent function."
请注意,替换时,这些带连字符的单词被完全替换(即不仅仅是连字符的部分),并且保留所有其他标点符号(带连字符的单词的外边界)。