我从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)
我试图在正则表达式的末尾添加+或*,但没有任何效果。
由于我是正则表达式的初学者,我肯定会错过一些东西,有人可以指导我吗? 的问候,
答案 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个单词字符(字母,数字或下划线)。