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"
> 

(其中ABV只是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"])

【讨论】:

第一句似乎忽略了 R grep 函数具有反转参数的事实:rm(list=grep("dat", ls(), value=TRUE, invert=TRUE))。这将保留名称中包含“dat”的任何名称,或者如果您想减少包容性,可以使用“^dat$”模式。 (我认为需要更有选择性,只删除非功能。) @DWin,非常正确。我只是采用他的正则表达式并展示如何在 R 中做到这一点。我没有努力制定正则表达式。

以上是关于R中的正则表达式:匹配所有内容,但不匹配“某些字符串”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式不匹配某些字符串!

如何匹配以下字符串,但不包括JS中的单词字符与正则表达式?

正则表达式,匹配除 \r \n 之外的所有内容作为普通字符

ORACLE的正则表达式(摘自网上)

php 正则表达式匹配不以某些字符开始的字符串

正则表达式匹配捕获组前面没有某些字符