使用正则表达式在list.files()中查找不以特定字符串开头的文件

3

我想列出一个文件夹中不以特定字符串开头的文件。我尝试使用下面的正则表达式,但没有成功。我想要列出不以“SH”开头的文件。这会给我一个语法错误:

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

尝试使用 myFiles = list.files(pattern = "^(?!SH).*\\.csv", perl=T) - Wiktor Stribiżew
1
如果不接受 perl=T,请尝试 "^[^S].*\\.csv|^.[^H].*\\.csv|^.\\.csv"。或者更紧凑的写法是 ^(.|[^S].*|.[^H].*)\\.csv - Wiktor Stribiżew
我添加了我的答案。很高兴它对你有用。 - Wiktor Stribiżew
我对R和正则表达式都很陌生。在@stribizhev的回答中,您检查了一个单一字符(.)在开头(^)。该表达式将返回不以S或(|)H开头的字符串。我的理解正确吗? - SriniShine
是的,没错。这是一种绕过不支持环视的正则表达式引擎的方法。 - Wiktor Stribiżew
显示剩余2条评论
4个回答

2
您可以尝试使用grep命令:
grep("^((?!SH).)*\\.csv", list.files(), perl=T, value=T)

1
虽然list.files允许使用正则表达式进行匹配,但它似乎没有grepgsubgregexp所描述的完全灵活性,具体请参见help('regex'),特别是它没有一个perl参数与模式一起传递。
然而,以下方法可以解决问题(假设您想要所有不以SH开头但以.csv结尾的文件)。
list.files(pattern = '^[^SH].+\\.csv$')

1
你可以使用以下正则表达式来解决list.files()中缺少perl=T支持的问题:
^(.|[^S].*|.[^H].*)\\.csv

这是一个演示如何使用此正则表达式的示例

此正则表达式允许任何一个字符的文件名,或者没有以SH开头的两个字符的文件名和任何其他文件名。

因此,请使用

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

0

此函数列出所有文件,不以“SH”开头且以“.csv”结尾。

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

或者如果您想忽略大小写,请使用ignore.case=T

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


谢谢nurandi。然而,该表达式的结果是所有文件和文件夹(不过滤csv文件),而不是以SH开头的文件。 - SriniShine
@stribizhev的回答很棒。但是它也列出了文件夹。添加myFiles = myFiles[!file.info(myFiles)$isdir]来排除文件夹。 - nurandi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接