2017-07-07 14 views
3

ここでは多くの正規表現の回答を検索しましたが、この種の問題の解決策を見つけることはできません。私はリンクから私のテキストをクリーンアップしようとしている文字列をtibbleからその文字列の一部に置き換えます

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

私のデータセットは、Wikipediaのリンクを持つtibbleです。 この:

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(パターン=' \\ [。+ \\ | '、replacement =' ')%>% gsub(パターン=' \\] | \\ [ '、'置換 '=' ') –

答えて

5

あなたは

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

単一GSUB操作を使用することができonline R demoを参照してください。 2 [シンボル

  • (?:[^]|]*\\|)? - -
    • [^]|]*に一致オプション配列 - ゼロ以上]以外の文字と|
    • \\| -

      パターン

      • \\[{2}にマッチしますパイプ記号
    • ([^]]*) - グループ1:]
    • ]{2}以外のゼロ個以上の文字 - 2 ]のシンボル。
  • +2

    あなたの正規表現のスキルはばかげています+1 –

    +0

    ' [^] |] * 'を' [^] | * [?]](*!))[*] * *と?[^]] * * 'を実行し、' perl = TRUE'引数をgsubに追加します。 –

    +0

    ありがとう!優れた作品! – raoul

    関連する問題