如何使用R的str_detect排除特定词组'carte d'identité',仅检测含'identit'词根的内容
如何使用R的str_detect排除特定词组'carte d'identité',仅检测含'identit'词根的内容
嗨,我完全懂你的困扰——想通过str_detect找出包含"identit"词根的文本,但要把"carte d'identité"这个完全无关的组合排除掉对吧?之前的正则写法逻辑不对,所以才出现了反效果,我们来一步步调整解决。
问题出在哪?
你之前写的[^carte d']identité是字符组匹配,它的意思是"匹配一个不是c、a、r、t、e、空格、d、'的字符,后面跟着identité",这和你想要"排除整个'carte d'identité'词组"的需求完全不符,所以才会出现错误的匹配结果。
正确的解决方案:负向后瞻正则
我们可以用**负向后瞻断言(negative lookbehind)**来实现这个需求,它能确保匹配"identit"词根的同时,前面不是"carte d'"这个特定前缀。具体的正则写法和代码如下:
library(dplyr) library(stringr) # 你的示例数据 df <- data.frame(text = c("Ma carte d\'identité","Notre identité", "ce n'est pas l'identité du pays", "d'identité", "tasty buns")) # 执行检测,注意要加perl=TRUE启用PCRE正则 df_detect <- df %>% mutate(identit = str_detect(text, "(?<!carte d')identit", perl = TRUE))
正则解释
(?<!carte d'):这是负向后瞻断言,它的作用是检查当前位置的前面不是"carte d'",完美避开你想排除的词组;identit:匹配你需要的词根,能覆盖"identité"、"identitaire"等所有同词根的词;perl=TRUE:R的基础正则不支持向后瞻,所以必须启用PCRE模式才能生效。
运行结果
执行后你会得到符合预期的结果:
| text | identit |
|---|---|
| Ma carte d'identité | FALSE |
| Notre identité | TRUE |
| ce n'est pas l'identité du pays | TRUE |
| d'identité | TRUE |
| tasty buns | FALSE |
正好实现了你想要的——仅排除"carte d'identité",其他包含"identit"词根的文本都被正确检测到。
如果之后还有其他类似需要排除的词组,只要扩展负向后瞻部分就行,比如(?<!carte d')(?<!autre_exclusion )identit就可以同时排除多个前缀~
备注:内容来源于stack exchange,提问作者Samnang
相关产品推荐
相关产品推荐

