正则表达式用于查找文件

4
好的,我放弃了,在阅读了正则表达式的帮助文章之后,我仍然不知道我在寻找什么,所以我要问一个问题:
我有一个文件列表:
files <- c("files_combined.csv","file_1-10.csv","file_11-20.csv",
           "file_21-30.csv","file_2731-2740.csv","file_2731-2740.txt")

我只想要以"file_"开头并以".csv"结尾的csv文件。我知道它看起来像这样:
grep(pattern = "^file_???.csv$" ,files)

但我需要找到正确的正则表达式,忽略第一个和第二个模式之间的字符数("file_" + ".csv")。如果有人知道 R 中完整的正则表达式列表,我将非常感激,因为每次阅读帮助文档都很繁琐,而且像我这样有时候并不成功...

2
类似于“^file_.*\.csv$”这样的东西可能吗? - David Arenburg
2
grep("^file_.+\\.csv$",files,value=T) 这样做符合你的要求吗? - Heroka
为了以后参考,我已经打印出并贴在办公室墙上了 这个 正则表达式备忘单(该网站现在似乎已经无法访问,但我相信还有其他版本)。我知道正则表达式在一开始可能会令人望而生畏... 而且 R 文档本来就不是很清晰易懂(仍在等待 SO 文档的消息...)。也许你也应该尝试在一些 R 正则表达式问题中进行探索,可以看看 这里 - MichaelChirico
正则表达式并不是仅限于R语言的,它们存在于自己的领域。这就是为什么你不能通过阅读R文档页面?regex来学习如何使用它们。我建议从这个教程开始:http://www.zytrax.com/tech/web/regex.htm - nicola
1
有一个叫做"txt2re"的网站可以根据给定的字符串创建正则表达式模式。也许这对你未来的工作会有所帮助! - Graphican0
1
@MichaelChirico 通过 Wayback Machine 可以访问到那个备忘单的 PDF 版本:https://web.archive.org/web/20111024203537/http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/pdf/ - IRTFM
2个回答

5

R提供了一个使用通配符扩展的函数,可以使用glob模式,适用于那些不喜欢正则表达式的人:

files <- Sys.glob("file_*.csv")

这应该与您的模式匹配。


那也是我的第一猜想。但似乎R在这里有不同的逻辑。至少对我来说它没有效果... - JBGruber
文档确认所有系统都应将“*”解释为“匹配零个或多个字符”,因此它应该匹配以“file_”开头并以“.csv”结尾的任何内容,正如所需(当前工作目录中的文件)。 - doctorG
所以发生了什么: `> files <-c("files_combined.csv","file_1-10.csv","file_11-20.csv",
  • "file_21-30.csv","file_2731-2740.csv","file_2731-2740.txt")
    files <- Sys.glob("file_*.csv") files character(0) 与另一个答案相比> grep("^file_.+\.csv$",files,ignore.case = T) [1] 2 3 4 5`
- JBGruber
可能是个愚蠢的问题。您当前的工作目录中实际上是否有这些文件呢?您的第一行创建了一个字符向量;而 Sys.glob 的第二行实际上在您当前的工作目录中查找与该模式匹配的文件。list.files() 是否返回包含所需文件的向量呢? - doctorG
我现在明白我的错误出在哪里了。"file_*.csv"的组合不能与greplist.files一起使用。这就是为什么我无法在我的示例字符向量上复制它的原因。但是你在找到我要找的实际文件(符合模式"mesa_*.csv"的那个,另一个只是例子...)方面是100%正确的!看来Sys.glob使用通配符,而R中的其他函数使用正则表达式(到目前为止,我对差异并不知晓)。 - JBGruber
我意识到我可能有点过于草率地假设你是在寻找文件,而不是想要从字符向量(也许是从另一个函数的输入)中工作。由于我习惯于使用Linux,自然会考虑“ls * .csv”或“ls file_* .csv”,而Sys.glob()是用于该功能的自然函数。是的,如果您有一个字符向量作为输入,则需要使用其中一个regexp函数。此外,请注意,如果您想/需要使用regexp查找文件,则list.files()需要一个regexp模式参数。 - doctorG

2
非常感谢!看来 David Arenburg 和 Heroka 你们同时提供了解决方案。同时也要感谢 MichaelChirico 提供的小抄。
以下是对我特定问题的答案:
grep("^file_.+\\.csv$",files,ignore.case = T)

关于正则表达式的问题,这个工具也非常有用 txt2re


这不是一个答案。 - Heroka
Heroka,你给出了答案,但我不能接受它,因为你把它发布为评论。我想关闭这个问题... - JBGruber
@Idos,答案已经得到改进,现在回答了问题。 - Roland
@JonGrub 我其实无所谓,因为那个答案和这个几乎一模一样。你可以接受自己的答案来关闭它。 - Heroka

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