r dplyr 过滤器:用于排除 AND 匹配的正则表达式



上下文:使用dplyrfilter,排除(Windows(指示它正在使用的文件名条目的版本,但保留该文件名的未修饰版本。

我想:

  • 排除包含"/~$"的列表条目
  • 和 选择以 "__MATCH__9999.xlsx" 结尾的条目,其中9999可以是任意数量的随机整数。

输入:注意前两个条目引用同一文件

 fl=tibble(fn=c("C:/a/b/c/~$a__01__IQ9__FQ__MATCH__4567.xlsx",
      "C:/a/b/c/a__01__IQ9__FQ__MATCH__4567.xlsx",
      "C:/a/b/c/a__01__IQ2__FQ__NOTMATCH__8910.xlsx"))
fl %>%
  filter(grepl("regexp",fn))

期望的结果 :

"C:/a/b/c/a__01__IQ9__FQ__MATCH__4567.xlsx"

部分/黑客 我不知道如何将这两个步骤减少为一个....

> fl %>% 
  filter( grepl("(__MATCH__[\d]+\.xlsx$)",fn,perl=TRUE) ) %>%
  filter( !grepl("\$",fn,perl=TRUE) )
# A tibble: 1 x 1
                                         fn
                                      <chr>
1 C:/a/b/c/a__01__IQ9__FQ__MATCH__4567.xlsx

启用perl作为默认引擎,您可以使用前瞻:

fl %>% 
  filter(grepl("^(?!.*/~\$).*__MATCH__\d+\.xlsx$",fn, ignore.case = FALSE, perl = TRUE))
# A tibble: 1 x 1
                                         fn
                                      <chr>
1 C:/a/b/c/a__01__IQ9__FQ__MATCH__4567.xlsx

故障:

  • ^ 断言输入字符串的开头
  • (?!.*/~\$) 不应包含/~$
  • .*__MATCH__\d+\.xlsx 匹配此文字
  • $ 发生在最后

最新更新