如何在r中的特定位置的另一个字符串中插入某个字符串?

时间:2014-06-05 13:48:20

标签: r text-mining

我是R的新手。这可能是一件非常简单的事情,但我无法弄明白。

说,我有一个字符串如下:

This is an example string.

现在我想按如下方式进行:

This is an (example/sample) string.

我知道要进行更改的位置。 (给定字符串中的第12个字符)。

我有很多字符串,我需要执行类似的操作。

3 个答案:

答案 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."

请注意,替换时,这些带连字符的单词被完全替换(即不仅仅是连字符的部分),并且保留所有其他标点符号(带连字符的单词的外边界)。