如何在 R 中使用正则表达式应用 a 而不是 b 模式匹配

How to apply a and not b pattern match using regex in R

我想通过仅保留包含维度或包含指标但不包含渗透的项目来过滤列表

我可以筛选出包含维度 OR 指标和渗透的那些,但我看不到如何将第二种情况的逻辑切换为指标而不是渗透

示例如下:

> library(stringr)

> var_list <- c("other", "dimension_1", "dimension_2", "metric_1", "metric_2", "metric_3_penetration")

> str_detect(var_list, "dimension|(?=.*metric)(?=.*penetration)")

[1] FALSE  TRUE  TRUE FALSE FALSE  TRUE

我想从 str_detect return 结果如下:

[1] FALSE  TRUE  TRUE TRUE TRUE FALSE

对于第二种情况,您可以结合使用负前瞻和正前瞻:

> library(stringr)
> var_list <- c("other", "dimension_1", "dimension_2", "metric_1", "metric_2", "metric_3_penetration")
> str_detect(var_list, "dimension|^(?=.*metric)(?!.*penetration)")
[1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE

当字符串有 metric 而没有 penetration.

时,^(?=.*metric)(?!.*penetration) 正则表达式匹配

要只检查整个单词,请添加 (?:\b|_) 边界:

str_detect(var_list, "dimension|^(?=.*(?:\b|_)metric(?:\b|_))(?!.*(?:\b|_)penetration(?:\b|_))")

grepl 调用的逻辑组合很简单,不涉及包:

grepl("dimension",var_list) | (grepl("metric",var_list) & !grepl("penetration",var_list))
## [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE