r dplyr筛选器:要排除和匹配的regexp

r dplyr筛选器:要排除和匹配的regexp,r,regex,dplyr,grepl,R,Regex,Dplyr,Grepl,上下文:使用dplyr和filter,排除(Windows)文件名条目的版本,指示该条目正在使用,但保留该文件名的未修饰版本 我想: 排除包含“/~$”的列表项 然后选择以“\uuuuu MATCH\uuu9999.xlsx”结尾的条目,其中9999可以是任意数量的随机整数 输入:注意前两个条目指的是同一个文件 fl=tibble(fn=c("C:/a/b/c/~$a__01__IQ9__FQ__MATCH__4567.xlsx", "C:/a/b/c/a__01__IQ9__

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

我想:

  • 排除包含“/~$”的列表项
  • 然后选择以
    “\uuuuu MATCH\uuu9999.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"
Partial/Hack我不知道如何将这两个步骤简化为一个

> 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
>fl%>%
过滤器(grepl(“(\uuu匹配\uu[\\ d]+\\.xlsx$)”,fn,perl=TRUE))%>%
过滤器(!grepl(“\\$”,fn,perl=TRUE))
#一个tibble:1x1
fn
1 C:/a/b/C/a__01__IQ9__FQ__匹配__4567.xlsx

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

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
fl%>%
过滤器(grepl(“^(?。*/~\\$).\uuu匹配\uuuu\\d+\\\.xlsx$”,fn,ignore.case=FALSE,perl=TRUE))
#一个tibble:1x1
fn
1 C:/a/b/C/a__01__IQ9__FQ__匹配__4567.xlsx
细分:

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

正在尝试执行
筛选(grepl(“^(?。.*/\$).\uu匹配\\ud+\.xlsx$”,fn))
?可能吗?该regexp在更正转义字符后返回0行。我不是R专家,但发现grepl默认引擎不支持lookaheads。所以:
filter(grepl(“^(?。*/\\$).\uu匹配\\\d+\\.xlsx$”,fn,ignore.case=FALSE,perl=TRUE))
fl%>%filter(grepl(^(?.*/\\$).\uu匹配\\\d+\\.xlsx$”,fn,perl=TRUE))将起作用。revo在
匹配之后错过了一个
如果你发布了一个工作版本,我可以接受作为答案。