用R中的句子的第N个单词替换模式

时间:2019-08-06 21:20:11

标签: r regex

假设我的句子为txt2 <- "useRs may fly into JFK or laGuardia"

我可以将给定句子的第一个和最后一个字母大写,第一个单词为:

sub("(\\w)(\\w*)(\\w)", "\\U\\1\\E\\2\\U\\3", txt2, perl=TRUE)

,最后一个字为:

sub("(\\w)(\\w*)(\\w)+$", "\\U\\1\\E\\2\\U\\3", txt2, perl=TRUE)

使用R中类似的概念将第三个单词大写为FlY的技巧是什么?

2 个答案:

答案 0 :(得分:3)

您可以使用

txt2 <- "useRs may fly into JFK or laGuardia"
id <- 3
sub(paste0("((?:\\w+\\W+){", id-1, "})(\\w)(\\w*)(\\w)"), "\\1\\U\\2\\E\\3\\U\\4", txt2, perl=TRUE)
## => [1] "useRs may FlY into JFK or laGuardia"

请参见R demo online。另外,请参见regex demo

请注意,sub仅替换第一个匹配项。 ((?:\w+\W+){2})(\w)(\w*)(\w)模式匹配

  • ((?:\w+\W+){2})-第1组:两次出现1个以上的字符字符,然后是1个以上的非字符字符 -(\w)-第2组:要处理的单词的开头字符char
  • (\w*)-第3组:要处理的单词的中间位置
  • (\w)-第4组:要处理的单词的最后一个单词char。

答案 1 :(得分:1)

我本人认为另一种方法不如@Wiktor的回答强健

txt2 <- "useRs may fly into JFK or laGuardia"
n <- 4

gsub(paste0('^(\\s*(?:\\S+\\s+){',n-1,'})\\S+'),
     paste0("\\1",gsub("(\\w)(\\w*)(\\w)", "\\U\\1\\E\\2\\U\\3", 
                       unlist(strsplit(txt2, split=" "))[n], 
                       perl = TRUE)),
    txt2)

 # [1] "useRs may fly IntO JFK or laGuardia"

用大写字母(第一个和最后一个字母)替换第n个 词,而Wiktor的答案直接 起作用。