使用gsub函数从字符串中删除模式

36

我很困惑如何删除字符串中下划线前的子字符串。 我希望使用 *(通配符),因为下划线前的部分可能会变化:

a <- c("foo_5", "bar_7")

a <- gsub("*_", "", a, perl = TRUE)
结果应该看起来像这样:
> a
[1] 5 7

我还尝试了"^*"或"?"之类的东西,但并没有真正起作用。

4个回答

59
以下代码可用于您的示例:
gsub(".*_", "", a)

非常感谢。'.'代表什么?星号“*”(通配符)为什么不能单独使用?我不明白。 - user969113
4
“.”代表任意一个字符,“.*”代表零个或多个任意字符。您可以输入“?regex”以获取更多解释。 - Pop
1
啊,我明白了!我以为 * 已经包含了 '.' 的意思了!现在我知道得更清楚了。再次感谢! - user969113
1
澄清一下,您将正则表达式(regex)语法与glob语法混淆了;两者都使用星号字符*作为通配符,但在两者之间略有不同的含义。 - user5359531

8

或者,您也可以尝试以下方法:

gsub("\\S+_", "", a)

2

只是想指出,有一种使用tidyverse函数的方法,我发现比gsub更易读:

a %>% stringr::str_remove(pattern = ".*_")

a是一个向量而不是数据框,这将导致以下错误:'警告信息:在stri_replace_first_regex(string,pattern,fix_replacement(replacement))中,参数不是原子向量;强制转换。' - Colin McGovern

-2
as.numeric(gsub(pattern=".*_", replacement = '', a)
[1] 5 7

2
始终在您的答案中添加解释,以便更好地理解代码。 - bigbounty

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