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

时间:2016-02-19 12:09:47

标签: regex r gsub

编辑:

我想在文本中的特定未知单词之前放置一个\n。我知道第一次在我的文本中出现未知单词将在“树”和“湖”之间

实施例。文字:

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

编辑:

“树”和“湖”永远不会改变,但它们之间的词总是在变化,所以我不在我的regex

中寻找“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)}

text之后我希望gsub看起来像什么:

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

编辑:

来自Wiktor Stribizew的评论我能够成功gsub

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

但这只会在“RU”介于“Tree and”Lake“之间的情况下执行gsub,这是未知单词的第一次出现。未知单词在这种情况下”RU“会出现多次在文本中,当“RU”是一个完整的单词时,我想将\n放在每个“RU”出现的前面。

新的Ex。文本。

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

新的Ex。我想要的是什么:

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

任何帮助将不胜感激。如果需要进一步的信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

您需要首先和“Lake”之间找到未知单词。你可以使用

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

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

然后,当您知道该单词时,请将其替换为

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

请参阅IDEONE demo

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

<强>更新

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

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