使用R中的gsub函数删除一个匹配模式

3

我有一个字符串Project Change Request (PCR) - HONDA DIGITAL PLATEFORM保存在supp_matches中,而supp_matches1包含字符串Project Change Request (PCR) -

supp_matches2 <- gsub("^.*[supp_matches1]","",supp_matches)
supp_matches2
# [1] " (PCR) - HONDA DIGITAL PLATEFORM"

这句话的实际意思并不正确,应该改为:
supp_matches2
# [1] "HONDA DIGITAL PLATEFORM"

为什么它没有按照预期的方式出现?


你能否为 supp_matchessupp_matches1 添加简单的赋值语句或者将它们使用 dput 呈现出来? - hrbrmstr
在您的表达式中,您要求删除字符串开头的任何字符0次或多次,然后跟随括号中放置的一个字母(您可以尝试删除对象supp_matches1并执行gsub("^.*[supp_matches1]","",supp_matches),您将获得完全相同的结果。 - Cath
gsub(sprintf("^.*%s", supp_matches1), "", supp_matches),你还需要转义 supp_matches1 中的括号,但最好是描述一下你要查找的模式,比如说“-”后面的所有内容?而不是使用这种方法。 - rawr
supp_matches1是一个变量@rawr,在这种情况下,应该在"-"后面删除字符,但是supp_matches1中的字符串将会改变。因此,我想从supp_matches中删除变量字符串。 - Shivpe_R
现在我不确定你想要哪个字符串。你可以使用 gsub('(.*) - (.*)', '\\2', supp_matches) 获取其中的一部分,通过将 \2 替换为 \1 来获取另一部分,或者使用 strsplit(supp_matches, ' - ')[[1]] 将字符串拆分成两部分。 - rawr
显示剩余2条评论
2个回答

3
正如我在评论中所说,你在表达式 gsub("^.*[supp_matches1]", "", supp_matches) 中并没有真正使用对象 supp_matches1,而只是使用了其中的字母。
你可以像这样做 gsub(paste0("^.*", supp_matches1), "", supp_matches) 来真正使用包含在 supp_matches1 中的表达式,但是,正如 @rawr 所提到的,你的表达式中有括号,所以你需要转义它们。
为了得到你想要的结果,你可以使用 gsub (sub) 函数的 fixed 参数,该参数表示参数 pattern 中的表达式将按原样匹配(因此,无需转义任何内容,但也没有真正的正则表达式)。
所以你需要的是: sub("Project Change Request \\(PCR\\) - ", "", supp_matches)
gsub(supp_matches1, "", supp_matches, fixed=TRUE) # or just with `sub` in this case
#[1] "HONDA DIGITAL PLATEFORM"

1
谢谢@CathG,我找到了我想要的东西。是的,我的代码没有将“supp_matches1”作为对象使用。现在问题已经解决了。 - Shivpe_R

3

已经有 @cathG 给出了 fixed=TRUE 的答案。如果你想使用正则表达式完成所有操作,可以尝试这个。

> w1 <- "Project Change Request (PCR) - HONDA DIGITAL PLATEFORM"
> w2 <- "Project Change Request (PCR) - "
> sub(paste0("^", gsub("(\\W)", "\\\\\\1", w2)), "", w1)
[1] "HONDA DIGITAL PLATEFORM"

这只是一种逃避特殊字符的方法,用于将您想要用作sub函数第一个参数的变量中存在的所有特殊字符转义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接