如何对 R 中两个单词之间的文本进行 gsub?

How to gsub on the text between two words in R?

编辑:

我想在文本中的特定未知词前放置一个 \n。我知道第一次出现在我的文本中的未知单词将在 "Tree" 和 "Lake"

之间

例如。文本:

text
[1]  "TreeRULakeSunWater" 
[2]  "A B C D"

编辑:

"Tree" 和 "Lake" 永远不会改变,但它们之间的词总是在变化,所以我不会在我的 regex[=27 中寻找 "RU" =]

我目前在做什么:

if (grepl(".*Tree\s*|Lake.*",  text)) { text <- gsub(".*Tree\s*|Lake.*", "\n\1", text)}

我在上面所做的事情的问题是 gsub 将分掉所有 text,只留下 \nRU

text
[1] "\nRU"

我也试过:

if (grepl(".*Tree *(.*?) *Lake.*",  text)) { text <- gsub(".*Tree *(.*?) *Lake.*", "\n\1", text)}

我希望 textgsub 之后的样子:

text
[1] "Tree \nRU LakeSunWater"
[2] "A B C D"

编辑:

根据 Wiktor Stribizew 的评论,我能够成功 gsub

gsub("Tree(\w+)Lake", "Tree \n\1 Lake", text)

但这只会对 "RU" 在“Tree 和 "Lake" 之间的出现进行 gsub,这是第一次出现的未知词。未知词在这种情况下 "RU"会在文中多次出现,当"RU"是一个完整的单词时,我想在每次出现"RU"的前面都加上\n

新例子。文本。

text
[1] "TreeRULakeSunWater"
[2] "A B C RU D"

新例子。我想要的:

text
[1] "Tree \nRU LakeSunWater"
[2] "A B C \nRU D"

如有任何帮助,我们将不胜感激。如果需要更多信息,请告诉我。

您需要先找到 "Tree" 和"Lake" 之间的生词。您可以使用

unknown_word <- gsub(".*Tree(\w+)Lake.*", "\1", text)

该模式匹配字符串中直到最后一个 Tree 的任何字符,然后捕获直到 Lake 的未知单词(\w+ = 一个或多个单词字符)和然后匹配字符串的其余部分。它替换向量中的所有字符串。您可以通过 [[1]] 索引访问第一个。

然后,当你知道这个词时,将其替换为

gsub(paste0("[[:space:]]*(", unknown_word[[1]], ")[[:space:]]*"), " \n\1 ", text)

参见 IDEONE demo

在这里,你有 [[:space:]]*( + unknown_word[1] + )[[:space:]]* 模式。它匹配未知单词两端的零个或多个空格,以及未知单词本身(捕获到组 1 中)。在替换中,空格被缩小为 1(如果有 none 则添加),然后 \1 恢复未知单词。您可以将 [[:space:]] 替换为 \s.

更新

如果您只需要在 RU 之前添加一个换行符,即整个单词,请使用 \b 单词边界:

> gsub(paste0("[[:space:]]*\b(", unknown_word[[1]], ")\b[[:space:]]*"), " \n\1 ", text)
[1] "TreeRULakeSunWater" "A B C \nRU D"