2015-08-28 36 views
2

我試圖列出文件不以特定的字符串開始的文件夾中。我嘗試使用下面的正則表達式,但沒有成功。我想列出不以「SH」開頭的文件。這給了我一個語法錯誤:正則表達式來查找文件不是從一個特定的字符串開始與list.files()

myFiles = list.files(pattern = "^((?!SH).)*\\.csv") 
+0

試試'myFiles = list.files(pattern =「^(?! SH)。* \\。csv」,perl = T)'。 –

+0

感謝您的回覆。但是R似乎並不認可perl = T。我需要爲此使用一個庫嗎? – SriniShine

+1

如果不接受'perl = T',請嘗試使用^「^ S]。* \\。csv | ^。[^ H]。* \\。csv | ^。\\。csv」'。或者更緊湊的'^(。| [^ S]。* |。[^ H]。*)\\。csv'。 –

回答

1

您可以使用下面的正則表達式來解決缺乏perl=T支持在list.files()

^(.|[^S].*|.[^H].*)\\.csv 

這裏是a demo of how this regex work

這REG ex允許任何1個字符的文件名,或者2個字符的文件名,在開始時不包含SH以及任何其他文件名。

因此,使用

myFiles = list.files(pattern = "^(.|[^S].*|.[^H].*)\\.csv") 
+1

謝謝。正則表達式工具很酷! – SriniShine

2

您可以嘗試grep

grep("^((?!SH).)*\\.csv", list.files(), perl=T, value=T) 
+0

感謝博維爾上校。你的解決方案也適用。 – SriniShine

1

雖然list.files允許進行匹配的正則表達式,它不會(出現),以有grepgsub了充分的靈活性或gregexp,如help('regex')中所述,具體而言,它沒有perl參數與模式一起傳遞。

然而,下面應該做的伎倆(假設你不想要的所有文件開始與SH,但.csv結束。

list.files(pattern = '^[^SH].+\\.csv$') 
+0

謝謝mnel。這個也可以。 – SriniShine

0

此功能列表中的所有文件開始 「SH」,並與名爲 「.csv」

list.files()[!grepl("^SH.*\\.csv$",list.files())]

,或者如果你想忽略的情況下結束,請使用ignore.case=T

list.files()[!grepl("^SH.*\\.csv$",list.files(),ignore.case=T)]

+0

謝謝nurandi。但是,表達式會導致所有文件和文件夾(不會過濾csv文件)不以SH開頭。 – SriniShine

+0

@stribizhev答案很酷。但是,它也列出了文件夾。添加'myFiles = myFiles [!file.info(myFiles)$ isdir]'來排除文件夾 – nurandi

相關問題