使用R,如何在这种情况下正确使用str_extract?

时间:2016-11-27 23:23:56

标签: r regex

我从Ronak Shah和akrun(in this post)学到了如何构造一个正则表达式来排除数据框中的每个术语(在我的例子中为alldata),除了那些单词,

  

^ \ 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)

我试图在正则表达式的末尾添加+或*,但没有任何效果。

由于我是正则表达式的初学者,我肯定会错过一些东西,有人可以指导我吗? 的问候,

1 个答案:

答案 0 :(得分: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) - &gt; (?s)

<强>详情:

  • (?i) - 不区分大小写的修饰符(适用于PCRE和ICU正则表达式)
  • \s* - 0+ whitespaces
  • \b - 领先的单词边界
  • (?!(?:word1|word2|word3|word4|word5)\b) - 单词不能等于word1等。
  • \w+ - 1个单词字符(字母,数字或下划线)。