使用list.files匹配带有正则表达式的文件

时间:2013-11-22 13:44:13

标签: regex r

我有一个list.files的模式,可以找到其中的一些,但是当我尝试指定更多时,我什么也得不到。

在这里你可以看到只添加[:alpha:]所有文件列出之前我得到的一个值应该更少(如果我理解正则表达式):

> list.files(pattern = paste( "UP.csv", sep=""), ignore.case=FALSE)
[1] "TvsPTglult-PglultUP.csv" "TvsPTglusp-PgluspUP.csv"
[3] "TvsPTglysp-PglyspUP.csv" "TvsPTmeth-PmethUP.csv"
> list.files(pattern = paste( "[:alpha:]UP.csv", sep=""), ignore.case=FALSE)
[1] "TvsPTglusp-PgluspUP.csv" "TvsPTglysp-PglyspUP.csv"
[3] "TvsPTmeth-PmethUP.csv"
#Or just without paste and just '
> list.files(pattern = '[:alpha:]UP.csv', ignore.case=FALSE)
[1] "TvsPTglusp-PgluspUP.csv" "TvsPTglysp-PglyspUP.csv"
[3] "TvsPTmeth-PmethUP.csv"  
#And trying to specify with how many times it appears:
> list.files(pattern = '[:alpha:]{6,10}UP.csv', ignore.case=FALSE)
character(0)
#Adding a point to match any single character and I get just one
> list.files(pattern = '[:alpha:].UP.csv', ignore.case=FALSE, full.names=FALSE)
[1] "TvsPTglult-PglultUP.csv"

有人可以解释一下除了Pmeth之外我应该怎样做才能获得第一个命令中的所有命令? 但是请解释,我想更常使用正则表达式。

编辑:会话信息

sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_GB.UTF-8        LC_COLLATE=en_GB.UTF-8    
 [5] LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
 [11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C   

3 个答案:

答案 0 :(得分:2)

您需要将[:alpha:]放在另外一组方括号中:

ff <- c("TvsPTglult-PglultUP.csv","TvsPTglusp-PgluspUP.csv",
        "TvsPTglysp-PglyspUP.csv","TvsPTmeth-PmethUP.csv")

grep("[[:alpha:]]{6,10}UP.csv",ff)  ## 1 2 3 

答案 1 :(得分:1)

通过指定您希望字符串[[:alpha:]]之前的某个长度为UP.csv的字符串,您可以完成工作,但这是一个相当隐含的解决方案,对某些人来说很难否则要理解(包括你自己在10天内的时间)。

更直接,更易读的方式是通过使用参数meth来表示您不想要包含单词invert=TRUE的文件。

grep("meth", list.files(pattern="UP\\.csv$"), invert=TRUE, value=TRUE)

value=TRUE使grep返回匹配的值而非索引。

答案 2 :(得分:0)

这应该这样做,请查看?regex了解更多详情

list.files(path="./",pattern="[[:alpha:]]*-Pg.*UP\\.csv")

一些细节:[[:alpha:]]*匹配0个或更多字母,例如任何文字字符串。 -Pg匹配该精确字符串。 .*匹配任何可打印字符的字符串,最后UP\\.csv匹配&#34; UP.csv&#34;,您需要转义&#34;。&#34;否则它将被解释为正则表达式。