我有一个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
答案 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;否则它将被解释为正则表达式。