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

时间:2016-02-09 10:50:36

标签: regex r stringr

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

我可以过滤那些包含维度或度量和渗透的内容,但我看不出如何将第二种情况的逻辑转换为公制而不是渗透

以下示例:

> 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返回的结果如下:

[1] FALSE  TRUE  TRUE TRUE TRUE FALSE

2 个答案:

答案 0 :(得分:1)

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

> 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|_))")

答案 1 :(得分:1)

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

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