2016-11-27 93 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

查看已更新的答案。您似乎想删除不在列表中的任何单词。 –

相关问题