【问题标题】:R list.files: some regexes only return a single fileR list.files:一些正则表达式只返回一个文件
【发布时间】:2025-11-25 19:45:01
【问题描述】:

我对 list.files 命令中正则表达式的行为感到困惑。我有一个包含约 500 个文件的文件夹,大多数名称以“new_”开头并以“.txt”结尾。同一文件夹中还有一些其他文件,例如自述文件,_cabs.txt。

我想获取 new_*.txt 文件。我尝试了不同的方法来调用 list.files 不同的结果。他们是:

#1 This returns ALL files including README and others
list.files(path="correctpath/") 
#2 This returns ALL files including _cabs.txt, which I do not want.
list.files(path="correctpath/",pattern="txt")
#3 This returns ALL files I want, but...
list.files(path="correctpath/",pattern="new_")
#4 This returns just one of the new_*.txt files.  
list.files(path="correctpath/",pattern="new*\\.txt")
#5 This returns an empty list.
list.files(path="correctpath/",pattern="new_*\\.txt")

所以我有一个可行的解决方案,但想了解方法 4 和 5 的情况。

提前致谢

拉斐尔

【问题讨论】:

  • 您实际上需要转义,因为* 是一个特殊字符。所以像new_\\*.*txt 或者如果没有歧义的话只是new_.*txt。无法测试,无法创建新文件。

标签: r regex


【解决方案1】:
list.files(path="correctpath/",pattern="new_.*\\.txt")

* 表示 0 次或多次。如果要匹配任何字符 0 次或更长时间,则需要在其前面添加句点 .*,因为句点表示任何字符(换行符除外)。模式"new_.*\\.txt" 应该可以工作。

Good R regex reference.

【讨论】:

  • 谢谢!仍然想了解为什么运行时只列出一个文件 list.files(path="correctpath/",pattern="new*\\.txt")
  • @RafaelSantos 因为您可能有一个名为 new.txt 的文件,并且元字符 * 匹配 前一个字符 或更多 .