r dplyr filter:正则表达式排除AND匹配

问题描述 投票:0回答:1

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

我想:

  • 排除包含“/〜$”的列表条目
  • AND选择以"__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
r regex dplyr grepl
1个回答
1
投票

启用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匹配这个字面
  • $最后发生
© www.soinside.com 2019 - 2024. All rights reserved.