如何在 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
我想通过仅保留包含维度或包含指标但不包含渗透的项目来过滤列表
我可以筛选出包含维度 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