【问题标题】:r ls list.files pattern curly bracket expansion globbing does not workr ls list.files 模式大括号扩展通配不起作用
【发布时间】:2021-06-13 13:30:10
【问题描述】:

我需要在 R 函数 base::lsbase::list.filespattern 参数中扩展大括号。例如:

# in terminal
ls
# string1  stringX  stringYZ
ls string{1,X}
# string1  stringX

但是

# in R
list.files()
# "string1"  "stringX"  "stringYZ"
list.files(pattern="string{1,X}")
# error: invalid 'pattern' regular expression
list.files(pattern="string\\{1,X\\}")
# character(0) # i.e. finds nothing
list.files(pattern=glob2rx("string{1,X}"))
# character(0) # i.e. finds nothing

base::ls 也是如此。

非常感谢您的帮助,
克里斯

【问题讨论】:

  • 尝试:“string1$|X$”或“string(1|X)$”
  • 试试:list.files(pattern="^string(1|X)$")
  • 在 Bash 中,{1,X} 表示 1X。因此,您需要string(1|X) 或(这里,因为1X 是单个字符)string(?:1|X)string[1X]

标签: r regex glob


【解决方案1】:

list.files(pattern="^string(1|X)$") 有效(list.files(pattern="string(1|X)") 也是如此)。 谢谢!

【讨论】:

  • 不同之处在于,string(1|X) 也会匹配,例如Astring1 ls string{1,X}^string(1|X)$ 不会。
【解决方案2】:

sh 中类似ls string{1,X} 的结果可以通过以下方式获得:

list.files(pattern="^string(1|X)$")

或者,正如 @wiktor-stribiżew 在 cmets 中已经指出的那样,您可以使用:

list.files(pattern="^string[1X]$")

要进行完整的字符串匹配,您必须用^$ 包围模式。感谢@wiktor-stribiżew 的评论。

【讨论】:

  • 您可以提到 glob 需要完整的字符串匹配,这就是您使用 ^$ 锚点的原因。
猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
相关资源
最近更新 更多