假设我的句子为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
的技巧是什么?
答案 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的答案直接 起作用。