2017-07-07 272 views
3

我在这里搜索了很多正则表达式的答案,但找不到解决这类问题的方法。从字符串替换字符串的部分字符串

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

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

最后想要的字符串是什么? –

+0

'architect'。我想要''[[...]]'或'[[xxx |。]中的点...]]' – raoul

+0

'text.raw%>%gsub(pattern ='\\ [。+ \\ |',replacement ='')%>% gsub(pattern ='\\] | \\ [ ',replacement ='')' –

回答

5

你可以使用一个单一的GSUB操作

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

online R demo

的模式会匹配

  • \\[{2} - 2个[符号
  • (?:[^]|]*\\|)? - 任选的序列进行匹配
    • [^]|]* - 比]其他零个或多个字符和|
    • \\| - 一个管道符号
  • ([^]]*) - 第1组:比]
  • ]{2}零个或多个字符其他 - 2个]符号。
+2

您的正则表达式技巧很荒谬+1 –

+0

如果可能有单个右括号用'[^] |替换'[^] |] *'' ] *(?:](?!))[^] |] *)*'和'[^]] *'用'[^]] *(?:](?!])[^] *'并将'perl = TRUE'参数添加到gsub。 –

+0

谢谢!非常棒! – raoul