当前位置: 首页 > 知识库问答 >
问题:

使用R,如何在这个案例中正确使用str_extract?

包兴思
2023-03-14

我从Ronak Shah和akrun(在本文中)那里学到了如何构造正则表达式,以从数据帧(在我的示例中为alldata)中排除除这些单词之外的所有术语,

^\B WORD 1|WORD 2|WORD 3|WORD 4|WORD 5\

但出于某些原因,我不明白为什么它给了我

“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)

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

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

共有1个答案

谢昊乾
2023-03-14

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

> 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+

查看正则表达式演示

如果条目包含换行符,则还应添加修饰符:(?i)-

详情:

  • (? i)-不区分大小写的修饰符(适用于PCRE和ICU正则表达式)
  • \s*-0个空格
  • \b-前导词边界
  • (?!(?:word1|word2|word3|word4|word5)\b)-单词不能等于word1等。
  • \w-1个单词字符(字母、数字或下划线)。
 类似资料:
  • 问题内容: 我读了这篇文章《如何真正地,真正地使用QThreads》。完整说明,它说而不是子类qthread和重新实现run(),应使用moveToThread(QThread *)使用moveToThread将QObject推送到QThread实例上 这是C ++示例,但我不知道如何将其转换为python代码。 我一直在使用这种方法来生成qthread,但是如您所见,它使用的是不推荐的方式。我如

  • 问题内容: 从官方教程中: 在卸载和销毁组件之前立即调用。使用此方法执行任何必要的清除,例如使计时器无效,取消网络请求或清除在其中创建的所有DOM元素。 我了解“使计时器无效”。可以用终止。但是我不理解“清理在中创建的任何DOM元素”,我可以看到这种情况的示例吗? 问题答案: 如果网络请求发送库支持中止正在进行的网络请求调用,则绝对可以在方法中调用该请求。 但是,与清理元素有关。根据目前的经验,我

  • 问题内容: 我一直在尝试在Node.js中调用D3。我首先尝试使用脚本标签从D3的网站导入d3.v2.js D3的作者建议一个人应该“ npm install d3” …我做到了,我可以在节点控制台中成功调用它: 但是,当尝试使用“ node app.js”从app.js调用它时,我得到: 我意识到,D3的作者在其他地方已经明确规定了应该使用画布: https://github.com/mbost

  • 错误:由于隐式依赖模块中缺少导出函数,至少有一个模块具有未解析的导入。错误:发现具有不同CPU类型的模块。 但是这个DLL是从另一个运行良好的DLL派生出来的(尽管它是从VB代码调用的),但它也抛出了同样的两个错误。 最后,我是这样称呼它的:

  • 问题内容: 我只想检索UserAccount类中的某些列,所以我有以下代码: 我得到了空值作为回报。但是,如果我注释掉setProjections,我将获得具有所有属性的用户。在这种情况下,如何正确使用setProjection? 问题答案: 它返回一个Object数组,因此代码应为:

  • 问题内容: 我不知道我在哪里错了:/。当我运行这段代码时,我得到的只是一个空白元素。我似乎无法让insertRule方法执行任何操作(甚至不会产生错误)。我想念什么吗? 问题答案: 这有点令人困惑,但是您的代码确实可以工作,只是您看不到返回的XML树中插入的规则。 为了验证您的代码是否有效,您可以执行两个测试: 运行上面的代码片段,您可以看到CSS规则确实适用。并且属性也在控制台中更改。 当浏览器