问题描述
这是我们需要在工作目录中创建的reprex:
library(tidyverse)
library(openxlsx)
library(readxl)
write.xlsx(list(iris),"AA-excel-file.xlsx")
write.xlsx(list(iris),"BB-excel-file.xlsx")
write.xlsx(list(iris),"CC-excel-file.xlsx")
write.xlsx(list(iris),"DD-excel-file.xlsx")
write.xlsx(list(iris),"EE-excel-file.xlsx")
我的工作目录如下:
C:
├── my-R-working-directory/
├── AA-excel-file.xlsx
├── BB-excel-file.xlsx
├── CC-excel-file.xlsx
├── DD-excel-file.xlsx
└── EE-excel-file.xlsx
我精心制作了一个正则表达式(demo here),用于“选择”任何以AA
或BB
开头的文件:
^(?!AA|BB)\w+$
我想将此正则表达式与基数R list.files()
一起使用,以列出不是以AA
或BB
开头的所有文件。这是我的尝试:
list.files("path/of/folder",pattern = "\\^(?!AA|BB)\w+$.xlsx$",full.names = TRUE)
#> Error: '\w' is an unrecognized escape in character string starting ""\\^(?!AA|BB)\w"
#> Error: unexpected ')' in " full.names = TRUE)"
我认为我的模式论点有些偏离。这个类似的命令确实可以正常工作,但不会排除AA
和BB
文件:
list.files("path/of/folder",pattern = "\\.xlsx$",full.names = TRUE)
如何正确编写pattern
参数以排除以AA
或BB
开头的任何文件?如果有能力,您可以更正我的正则表达式吗?正则表达式似乎只能使用“字母或数字”字符。任何空格,破折号,圆点等都会破坏正则表达式(see demo)。
解决方法
您可以使用pattern
来获取所有xlsx
个文件,然后将以grep
或AA
开头的文件BB
取反:
library(tidyverse)
library(openxlsx)
library(readxl)
write.xlsx(list(iris),"AA-excel-file.xlsx")
write.xlsx(list(iris),"BB-excel-file.xlsx")
write.xlsx(list(iris),"CC-excel-file.xlsx")
write.xlsx(list(iris),"DD-excel-file.xlsx")
write.xlsx(list(iris),"EE-excel-file.xlsx")
grep("^(AA|BB).*",list.files(pattern = "\\.xlsx$"),invert = TRUE,value = TRUE)
#> [1] "CC-excel-file.xlsx" "DD-excel-file.xlsx" "EE-excel-file.xlsx"