R中的正则表达式:匹配所有内容但不是“某些字符串”

时间:2013-07-03 16:31:41

标签: regex r

另一个问题的答案解释了how to match a string not containing a word

问题(对我来说)是给出的解决方案在R中不起作用。

我经常从现有的向量创建data.frame(),并希望清理我的工作区。例如,如果我的工作区包含:

> ls()
[1] "A"   "B"   "dat" "V"
>

我想只保留dat,我必须用以下方法清理它:

> rm(list=ls(pattern="A"))
> rm(list=ls(pattern="B"))
> rm(list=ls(pattern="V"))
> ls()
[1] "dat"
> 

(其中ABV只是my.first.vector等大量复杂名称的示例,不容易与{{1}匹配})。

告诉rm(list=ls(pattern="[ABV]"))移除除rm()之外的所有内容最方便(对我来说),但问题是链接的问答中给出的解决方案不起作用:

dat

那么 我如何匹配除R中的> rm(list=ls(pattern="^((?!dat).)*$")) Error in grep(pattern, all.names, value = TRUE) : invalid regular expression '^((?!dat).)*$', reason 'Invalid regexp' > 以外的所有内容?

2 个答案:

答案 0 :(得分:4)

R中{p> Negative look-around需要perl=TRUE参数。因此,您将无法直接将ls(pattern = ...)与正则表达式一起使用。或者你可以这样做:

rm(list = grep("^((?!dat).)*$", ls(), perl=TRUE, value=TRUE))

如果您正在寻找不准确的比赛。如果你正在寻找完全匹配,你应该做Ferdinand所评论的:

rm(list=ls()[ls() != "dat"])

答案 1 :(得分:4)

这将删除除dat以外的所有对象。 (如果要删除名称以点开头的对象,请使用ls参数all.names = TRUE。)

rm( list = setdiff( ls(), "dat" ) )

"dat"替换为名称向量,例如c("dat", "some.other.object"),如果你想保留几个对象;或者,如果几个对象都可以通过正则表达式轻松匹配,请尝试这样的方法,删除名称不以"dat"开头的所有对象:

rm( list = setdiff( ls(), ls( pattern = "^dat" ) ) )

另一种方法是保存数据save("dat", file = "dat.RData"),退出R,启动新的R会话并加载数据1oad("dat.RData")。另请注意重新启动R的<{3}}