2013-11-22 4 views
2

У меня есть шаблон для list.files, который находит некоторые из них, но когда я пытаюсь указать немного больше, я ничего не получаю.Соответствующие файлы с регулярными выражениями с 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" 

Может кто-то пожалуйста, объясните, как я должен сделать, чтобы получить только все в первой команде, кроме Пмет?
Но, пожалуйста, объясните, я хотел бы чаще использовать регулярные выражения.

Edit: Info Session

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 

ответ

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 
+0

К сожалению, он не работает с 'list.files (pattern =" [[: alpha:]] {6,10} UP.csv ")' Я получаю то же самое '[1]" TvsPTglult-PglultUP. csv "" TvsPTglusp-PgluspUP.csv " [3]" TvsPTglysp-PglyspUP.csv "" TvsPTmeth-PmethUP.csv "' – Llopis

+0

Хмм. 'list.files (pattern =" - [[: alpha:]] {6} UP.csv ")' работает (помещает дефис в явном виде). Не знаю, почему. –

+1

На первый взгляд это похоже на ошибку - тот же шаблон работает по-разному в 'grep' и' list.files', но мне нужно будет поиграть с ним еще немного, чтобы убедиться. –

1

Указав, что вы хотите [[:alpha:]] строки определенной длины до проведения строка UP.csv, возможно, вы сможете выполнить эту работу, но это довольно неявное решение, которое трудно понять кому-то другому (включая вас через 10 дней).

Более прямой и понятный способ записи будет состоять в том, чтобы вместо этого указать, что вы не хотите файлы, включая слово meth, путем grepping с аргументом invert=TRUE.

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

value=TRUE делает grep возвращение значения соответствия, а не их индексы.

+0

Да, я знал это, но я просто пытался получить его более общий способ применения, когда в папке у меня есть PmethUP.csv и TmethUP.csv – Llopis

0

это должно сделать это, проверьте ?regex для более подробной информации

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

Некоторые детали: [[:alpha:]]* матчей 0 или более букв, например, любую текстовую строку. -Pg соответствует точной строке. .* соответствует строке любых печатных символов, и, наконец, UP\\.csv соответствует «UP.csv», вам нужно сбежать с символа «.». в противном случае это будет интерпретироваться как регулярное выражение.

+0

Это работает благодаря. Хотя я читал '? Regex', у меня все еще есть проблемы с пониманием этого, поэтому я попросил дать объяснение. Вместо того, чтобы заставить его работать. – Llopis

+0

@Llopis просмотреть изменения – ndr

Смежные вопросы