我在这里搜索了很多正则表达式的答案,但找不到解决这类问题的方法。
我的数据集是维基百科链接:
library(tidytext)
library(stringr)
text.raw <- "Berthold Speer was een [[Duitsland (hoofdbetekenis)|Duits]] [[architect]]."
我正在尝试从链接中清理文本。 这样:
str_extract_all(text.raw, "[a-zA-Z\\s]+(?=\\])")
# [1] "Duits" "architect"
从括号中选择我需要的单词。
此:
str_replace_all(text.raw, "\\[\\[.*?\\]\\]", str_extract(text.raw, "[a-zA-Z\\s]+(?=\\])"))
# [1] "Berthold Speer was een Duits Duits."
按预期工作,但不是我需要的。这样:
str_replace_all(text.raw, "\\[\\[.*?\\]\\]", str_extract_all(text.raw, "[a-zA-Z\\s]+(?=\\])"))
# Error: `replacement` must be a character vector
出现错误,我预期"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]+(?=\\])")))
我希望有人知道解决方案,或者如果存在问题,我可以指出一个重复的问题。我想要的输出是"Berthold Speer was een Duits architect"
。
答案 0 :(得分:5)
您可以使用单个gsub操作
text <- "Berthold Speer was een [[Duitsland (hoofdbetekenis)|Duits]] [[architect]]."
gsub("\\[{2}(?:[^]|]*\\|)?([^]]*)]{2}", "\\1", text)
请参阅online R demo。
模式匹配
\\[{2}
- 两个[
符号(?:[^]|]*\\|)?
- 可选的序列匹配
[^]|]*
- 除]
和|
以外的零个或多个字符\\|
- 竖线符号([^]]*)
- 第1组:除]
]{2}
- 两个]
符号。