【问题标题】:How to gsub on the text between two words in R?如何在R中两个单词之间的文本上gsub?
【发布时间】:2019-06-11 05:24:21
【问题描述】:

编辑:

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

例如。文字:

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)}

我希望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”是一个完整的单词时,我想将\n放在每个出现的“RU”前面。

新的前。文本。

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

新的前。我想要的:

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

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

【问题讨论】:

标签: regex r gsub


【解决方案1】:

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

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"   

【讨论】:

  • 感谢您的回答,它运行良好,但我确实有跟进。在我的文本中,未知词,在这种情况下,“RU”出现在许多其他词的中间。一旦我匹配了未知单词,我只想将\n 放在“RU”前面,当它是一个完整的单词时。我将再次编辑我的问题。感谢您的耐心等待。
  • 是不是需要达到[1] "TreeRULakeSunWater" "A B C \nRU D"?我将此方案添加到答案中。请避免多次更改问题,因此不赞成。
  • 是的,这是可以接受的。第一次出现不需要\n,但可以。随后的“RU”确实需要在其前面加上\n
  • 你会建议我删除这个问题并问一个新问题吗?
  • 为什么要删除它?我只是警告你,以免你未来的问题被否决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多