如何对 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)}
我希望 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 和 "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"
编辑:
我想在文本中的特定未知词前放置一个 \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)}
我希望 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 和 "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"