2016-11-27 91 views
2

我從Ronak Shah和akrun(in this post)如何構建一個正則表達式的每一個方面,從(在我的例子ALLDATA),除了那些話一個數據幀排除了解到,使用R,如何在這種情況下正確使用str_extract?

^\ BWORD1 | WORD2 | WORD3 | WORD4 | WORD5 \>

,但由於某些原因,想不通爲什麼它給我

「WORD2」, 「WORD3」,NA

代替

「WORD1 WORD2 WORD5」, 「WORD3」,NA

這裏是我的例子:

library(stringr) 
alldata <- data.frame(toupper(c("word1 anotherword word2 word5", "word3", "none"))) 
names(alldata)<-"columna" 
removeex <- c("word1" , "word2" ,"word3" ,"word4", "word5") 
regularexprex <- toupper(paste0("^\\b",paste0(removeex, collapse = "|"), "\\>")) 
alldata$columnb <- str_extract(alldata$columna, regularexprex) 

我試圖添加+或*在正則表達式的結尾但沒有任何影響。

由於事實上我是一個正則表達式的初學者,我肯定會錯過一些東西,有人可能會指導我呢? 問候,

+0

你是說你需要爲特定列表中的所有條目獲取NA? –

+0

我想保留列表中存在的所有單詞,刪除剩下的單詞。如果不存在,我會得到一個NA。抱歉不清楚。 –

回答

2

您需要在您的上述代碼的最後兩行替換,以

> regularexprex <- paste0("(?i)\\s*\\b(?!(?:",paste0(removeex, collapse = "|"), ")\\b)\\w+") 
## => "(?i)\\s*\\b(?!(?:word1|word2|word3|word4|word5)\\b)\\w+" 
> str_replace_all(alldata$columna, regularexprex, "") 
[1] "WORD1 WORD2 WORD5" "WORD3"    "" 

首先,toupper()轉向\b\B(非單詞邊界) - 你只需要一個不區分大小寫的匹配(我添加了(?i)修飾符),而單詞邊界不適用於該組,只適用於兩側的項目。

此外,你需要的是一個匹配整個字符串的模式,所以.*在模式的開始和結束。

更換最後的正則表達式看起來像

(?i)\s*\b(?!(?:word1|word2|word3|word4|word5)\b)\w+ 

regex demo

如果你的項目包含換行符,你還應該添加s修改:(?i) - >(?s)

詳細

  • (?i) - 不區分大小寫修飾符(可與PCRE和ICU正則表達式)
  • \s* - 0+空格
  • \b - 領先字邊界
  • (?!(?:word1|word2|word3|word4|word5)\b) - 中字不能等於word1
  • \w+ - 1個字以上的字符(字母,數字或下劃線)。
+0

謝謝Wiktor,但ANOTHERORD仍在列表中,因爲它不屬於列表word1 | word2 | word3 | word4 | word5。我如何排除它? 感謝您的幫助和鏈接。 –

+0

如果我使用(?i)。* \ b(word1 | word2 | word3 | word4 | word5)\ b。*,我會在第二行獲得word5和word3。 我不明白如何在第一行有word1 word2 word5,第二行有word5。 –

+0

查看已更新的答案。您似乎想刪除不在列表中的任何單詞。 –

相關問題