将tibble中的字符串替换为该字符串的一部分

rao*_*oul 3 regex r stringr tidytext

我在这里搜索了很多正则表达式的答案,但找不到解决这类问题的方法.

我的数据集是维基百科链接:

library(tidytext)
library(stringr)
text.raw <- "Berthold Speer was een [[Duitsland (hoofdbetekenis)|Duits]] [[architect]]."
Run Code Online (Sandbox Code Playgroud)

我正在尝试从链接中清理我的文本.这个:

str_extract_all(text.raw, "[a-zA-Z\\s]+(?=\\])")
# [1] "Duits"     "architect"
Run Code Online (Sandbox Code Playgroud)

从括号中选择我需要的单词.

这个:

str_replace_all(text.raw, "\\[\\[.*?\\]\\]", str_extract(text.raw, "[a-zA-Z\\s]+(?=\\])"))
# [1] "Berthold Speer was een Duits Duits."
Run Code Online (Sandbox Code Playgroud)

按预期工作,但不是我需要的.这个:

str_replace_all(text.raw, "\\[\\[.*?\\]\\]", str_extract_all(text.raw, "[a-zA-Z\\s]+(?=\\])"))
# Error: `replacement` must be a character vector
Run Code Online (Sandbox Code Playgroud)

给出了我预期的错误 "Berthold Speer was een Duits architect"

目前我的代码看起来像这样:

text.clean <- data_frame(text = text.raw) %>%
  mutate(text = str_replace_all(text, "\\[\\[.*?\\]\\]", str_extract_all(text, "[a-zA-Z\\s]+(?=\\])")))
Run Code Online (Sandbox Code Playgroud)

我希望有人知道解决方案,或者如果存在问题,我可以指出一个重复的问题.我想要的输出是"Berthold Speer was een Duits architect".

Wik*_*żew 5

您可以使用单个gsub操作

text <- "Berthold Speer was een [[Duitsland (hoofdbetekenis)|Duits]] [[architect]]."
gsub("\\[{2}(?:[^]|]*\\|)?([^]]*)]{2}", "\\1", text)
Run Code Online (Sandbox Code Playgroud)

查看 在线R演示.

模式将匹配

  • \\[{2}- 两个[符号
  • (?:[^]|]*\\|)? - 可选的序列匹配
    • [^]|]*- 除了]和之外的零个或多个字符|
    • \\| - 管道符号
  • ([^]]*) - 第1组:零以外的字符 ]
  • ]{2}- 两个]符号.

  • 你的正则表达式技巧是荒谬的+1 (2认同)