R中的sub
函数正在替换模式的 first occurence 。
示例:
> s <- "my name is sam"
> sub(" ","*",s)
[1] "my*name is sam"
然而,在三个空格(“”)的随机位置有一种简单的替换方法:
"my*name is sam"
"my name is*sam"
"my name*is sam"
答案 0 :(得分:1)
以下提供了可能的解决方案。简而言之,您可以在找到空格时分割您的句子。您使用sample()
选择一个随机位置,然后用您选择的字符(*)替换相应的空格。
最后,将所有内容粘贴在一起。
s <- "my name is sam"
# get your words
elems <- strsplit(s, " ")[[1]]
# recreate the spaces between words. Add an extra "" to add after the last word
spacer <- c(rep(" ", (length(elems)-1)), "")
# pick a random 'space' and replace it to *
pos <- sample(1:(length(elems)-1), size = 1)
spacer[pos] <- "*"
# paste everything together
result <- paste(paste(elems, spacer, sep = "", collapse = ""), sep = "", collapse = "")
结果
result
"my name*is sam"
再次运行相同的几行,采样是随机的,所以你应该得到所有三个可能的结果......
答案 1 :(得分:1)
使用stringr
:
library(stringr)
s <- "my name is sam"
index <- sample(str_locate_all(s, " ")[[1]][,1], 1)
str_sub(s, index, index) <- "*"
答案 2 :(得分:0)
另一种解决方案。计算空白并选择一个随机替换。然后根据随机选择的点构建正则表达式。此代码使用stringr包中的str_count
。
library(stringr)
position = sample(1:str_count(s, ' '), 1) - 1
pattern = paste0("((\\S*\\s){", position, "}\\S*)\\s")
sub(pattern, "\\1*", s)
关于正则表达式的说明。它会跳过第一个position
空白(以及所有非空白)以替换随机选择的空白。