R中的正则表达式:匹配所有内容,但不匹配“某些字符串”[重复]
Posted
技术标签:
【中文标题】R中的正则表达式:匹配所有内容,但不匹配“某些字符串”[重复]【英文标题】:Regex in R: match everything but not "some string" [duplicate] 【发布时间】:2013-07-01 11:06:44 【问题描述】:另一个问题的答案解释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"
>
(其中A
、B
和V
只是my.first.vector
等大量复杂名称的示例,这些名称不易与rm(list=ls(pattern="[ABV]"))
匹配)。
告诉rm()
删除除dat
之外的所有内容是最方便的(对我而言),但问题是链接问答中给出的解决方案不起作用:
> rm(list=ls(pattern="^((?!dat).)*$"))
Error in grep(pattern, all.names, value = TRUE) :
invalid regular expression '^((?!dat).)*$', reason 'Invalid regexp'
>
那么 如何 我如何匹配 R 中除了 dat
之外的所有内容?
【问题讨论】:
你试过rm(list=ls()[ls()!="dat"])
吗?
@Ferdinand.kraft 谢谢!没想到索引ls()
返回的对象。
重复How can I remove all objects but one from the workspace in R?
【参考方案1】:
这将删除除 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")
。另请注意 this method 重启 R.
【讨论】:
我不想退出 R 只是为了清理我的工作空间。 @what,就我个人而言,我尽量不使用rm
,而是更喜欢开始一个干净的 R 会话。如果您以可重现的方式编写软件,那么只需重新运行脚本即可。
是的,但是我的一些脚本会加载大量数据(来自 URL 或 Excel 工作簿),或者写入大量文件,并且执行需要几秒钟。此外,我喜欢您添加矢量的解决方案所提供的灵活性,因为它允许我删除创建 data.frame()
时留下的所有内容,并保留我一直保持的其他所有内容,而那些“剩菜”在退出R后会丢失,或者我也必须保存它们,这可能会使整个过程有点麻烦。【参考方案2】:
Negative look-around
需要 R 中的 perl=TRUE
参数。因此,您将无法直接将 ls(pattern = ...)
与该正则表达式一起使用。或者你可以这样做:
rm(list = grep("^((?!dat).)*$", ls(), perl=TRUE, value=TRUE))
如果您正在寻找不精确的匹配项。如果您正在寻找完全匹配,您应该按照 Ferdinand 的评论进行操作:
rm(list=ls()[ls() != "dat"])
【讨论】:
第一句似乎忽略了 Rgrep
函数具有反转参数的事实:rm(list=grep("dat", ls(), value=TRUE, invert=TRUE))
。这将保留名称中包含“dat”的任何名称,或者如果您想减少包容性,可以使用“^dat$”模式。 (我认为需要更有选择性,只删除非功能。)
@DWin,非常正确。我只是采用他的正则表达式并展示如何在 R 中做到这一点。我没有努力制定正则表达式。以上是关于R中的正则表达式:匹配所有内容,但不匹配“某些字符串”[重复]的主要内容,如果未能解决你的问题,请参考以下文章