【问题标题】:Using R, how to use str_extract properly on this case?使用 R,如何在这种情况下正确使用 str_extract?
【发布时间】:2017-04-11 15:08:21
【问题描述】:

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

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

但由于某些原因,无法弄清楚为什么它给了我

“WORD2”,“WORD3”,不适用

而不是

“WORD1 WORD2 WORD5”,“WORD3”,不适用

这是我的例子:

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)

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

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

【问题讨论】:

  • 您的意思是您需要为特定列表中的所有条目获取 NA?
  • 我想保留列表中存在的数据框中的所有单词,删除其余的。如果不在场,我会得到一个 NA。抱歉不清楚。

标签: r regex


【解决方案1】:

您需要将上面代码中的最后两行替换为

> 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+ 个单词字符(字母、数字或下划线)。

【讨论】:

  • 感谢 Wiktor,但 ANOTHERWORD 仍在列表中,因为它不属于列表 word1|word2|word3|word4|word5。我该如何排除它?感谢您的帮助和链接。
  • 更具体一点,如果我使用 (?i).*\b(word1|word2|word3|word4|word5)\b.* ,我会得到 word5 和 word3在第 2 行。我不明白如何在第一行使用 word1 word2 word5,在第二行使用 word5。
  • 查看更新后的答案。您似乎想删除任何不在列表中的单词。
猜你喜欢
  • 2020-08-06
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2013-11-21
  • 1970-01-01
相关资源
最近更新 更多