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

     2023-03-12     108

关键词:

【中文标题】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 中做到这一点。我没有努力制定正则表达式。

匹配模式与正则表达式不包括某些字符[重复]

】匹配模式与正则表达式不包括某些字符[重复]【英文标题】:Matchpatternwithregexexcludingcertaincharacters[duplicate]【发布时间】:2016-05-1919:20:21【问题描述】:我想使用正则表达式创建包含“[”和“]”括号之间的字符但不包含括号本... 查看详情

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

】正则表达式,匹配除\\\\r\\\\n之外的所有内容作为普通字符【英文标题】:Regex,matcheverythingexcept\\r\\nasnormalcharacter正则表达式,匹配除\\r\\n之外的所有内容作为普通字符【发布时间】:2021-08-2106:12:24【问题描述】:我在C#中使用... 查看详情

正则表达式选中以某些字符开始,某些字符结尾的字符串

...中ab00012(注意:ab和12也选中)求解这个应该怎么用正则表达式实现主要是用正则表达式的分组匹配技术。1、以某字符结尾:例如sex$;2、中间不包含该字符串:^((?!sex).*)3、最后合起来就是:^((?!sex).*)sex$“正则表达式”选中以... 查看详情

获取所有文本,但不获取正则表达式匹配 [重复]

】获取所有文本,但不获取正则表达式匹配[重复]【英文标题】:Getalltextbutnottheregexmatch[duplicate]【发布时间】:2019-03-0818:00:44【问题描述】:嗨:)我尝试获取所有与正则表达式不匹配的文本,我用PHP我的正则表达式是:/(<[^>]... 查看详情

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

】正则表达式匹配捕获组前面没有某些字符【英文标题】:Regularexpressiontomatchcapturegroupnotprecededbycertaincharacters【发布时间】:2021-07-2902:39:50【问题描述】:我想编写一个正则表达式,当且仅当模式前面没有字符“Etc/”时才会匹... 查看详情

正则表达式匹配不包含某些字符串(代码片段)

  正则表达式匹配不包含某些字符串:  ^(([email protected]).)*$ //如果包含@字符串会被匹配处理publicstaticvoidmain(String[]args)Stringreg="^(([email protected]).)*$";System.out.println("gdfgfgdffgn".matches(reg));   查看详情

正则表达式匹配超过 2 个空格但不匹配新行

】正则表达式匹配超过2个空格但不匹配新行【英文标题】:Regextomatchmorethan2whitespacesbutnotnewline【发布时间】:2011-08-0209:07:46【问题描述】:我想替换字符串中所有超过2个空格但不是新行,我有这个正则表达式:\\s2,但它也匹配... 查看详情

与正则表达式匹配时是不是可以忽略字符串中的字符

】与正则表达式匹配时是不是可以忽略字符串中的字符【英文标题】:Isitpossibletoignorecharactersinastringwhenmatchingwitharegularexpression与正则表达式匹配时是否可以忽略字符串中的字符【发布时间】:2012-01-2500:29:12【问题描述】:我想... 查看详情

正则表达式与新行之间的内容不匹配 (\r\n)

】正则表达式与新行之间的内容不匹配(\\\\r\\\\n)【英文标题】:Regexnotmatchingthecontentbetweenthenewlines(\\r\\n)正则表达式与新行之间的内容不匹配(\\r\\n)【发布时间】:2021-09-2411:07:42【问题描述】:我是第一次使用正则表达式,如果这... 查看详情

如何使用正则表达式匹配不以某些字符开头或结尾的单词?

】如何使用正则表达式匹配不以某些字符开头或结尾的单词?【英文标题】:Howtomatchwordsthatdoesn\'tstartnorendwithcertaincharactersusingRegex?【发布时间】:2020-02-0605:18:22【问题描述】:我想查找不以某些特定字符开头或结尾的单词匹配... 查看详情

正则表达式匹配数字的科学记数法但不匹配其他字母

】正则表达式匹配数字的科学记数法但不匹配其他字母【英文标题】:Regextomatchscientificnotationofnumbersbutnototherletters【发布时间】:2018-05-2512:11:59【问题描述】:我想编写一个正则表达式来匹配所有正双精度数,小数点后最多为2... 查看详情

shell编程shell中的正则表达式(代码片段)

目录Shell中的正则表达式1、正则表达式与通配符2、正则表达式规则3、练习测试的文本3.1匹配所有内容,包括空白行3.2匹配行至少包含有一个a的行3.3匹配行至少有俩个连续的a3.4匹配在s与d字符中间有俩个字符的单词的行3.6匹... 查看详情

Bash if 语句中的正则表达式匹配

】Bashif语句中的正则表达式匹配【英文标题】:RegexmatchinginaBashifstatement【发布时间】:2013-09-1315:13:34【问题描述】:我在这里做错了什么?尝试匹配任何包含空格、小写字母、大写字母或数字的字符串。特殊字符也不错,但我... 查看详情

正则表达式匹配两个 之间的所有内容

】正则表达式匹配两个之间的所有内容【英文标题】:Regexmatcheverythingbetweentwo正则表达式匹配两个之间的所有内容【发布时间】:2018-09-0207:34:27【问题描述】:我在这里查看了不同的答案,但不幸的是,它们都不适合我的情况。... 查看详情

正则表达式:匹配除特定模式之外的所有内容

】正则表达式:匹配除特定模式之外的所有内容【英文标题】:Regex:matcheverythingbutspecificpattern【发布时间】:2010-12-1320:14:30【问题描述】:我需要一个能够匹配所有内容的正则表达式但是一个以特定模式开头的字符串(特别是ind... 查看详情

R 正则表达式不匹配所有连字符

】R正则表达式不匹配所有连字符【英文标题】:Rregexnotmatchingallhyphens【发布时间】:2017-11-0507:17:48【问题描述】:在以下示例中,仅匹配第三个字符串,即使所有三个字符串中都有连字符:grep("-",c("January7–9,2015","Januarya–b,2015"... 查看详情

正则表达式选中以某些字符开始,某些字符结尾的字符串

...中ab00012(注意:ab和12也选中)求解这个应该怎么用正则表达式实现匹配以abc开头,以xyz结尾的字符串abc.*xyz等价于abc(.*)xyz解释:.匹配除换行符\n之外的任何单个字符。若要匹配包括\n在内的任意字符,请使用诸如[\s\... 查看详情

Java正则表达式匹配字符串中的所有单词

】Java正则表达式匹配字符串中的所有单词【英文标题】:Javaregextomatchallwordsinastring【发布时间】:2015-12-2319:01:38【问题描述】:我正在寻找一个匹配以下模式的正则表达式(abc|def|ghi|abc+def+ghi|def+ghi)基本上由|分隔的所有内容都是O... 查看详情