使用 gsub 替换 R 中最后一次出现的字符串

Using gsub to replace last occurence of string in R

我有以下字符向量,我需要用 gsub 修改。

strings <- c("x", "pm2.5.median", "rmin.10000m", "rmin.2500m", "rmax.5000m")

过滤后的期望输出 strings:

"x", "pm2.5.median", "rmin", "rmin", "rmax"

我目前的尝试适用于除 pm2.5.median 字符串之外的所有内容,该字符串包含需要保留的点。我真的只是想删除附加到每个变量末尾的缓冲区大小,例如1000m2500m5000m7500m10000m

gsub("\..*m$", "", strings)
"x", "pm2", "rmin", "rmin", "rmax"

匹配一个点、任意数量的数字、m 和字符串的末尾并将其替换为空字符串。请注意,我们在这里更喜欢 sub 而不是 gsub,因为我们只对每个字符串的一个替换感兴趣。

sub("\.\d+m$", "", strings)
## [1] "x"            "pm2.5.median" "rmin"         "rmin"         "rmax"   

.* 模式匹配任意 0 个或多个字符,尽可能多。 \..*m$ 模式匹配字符串中的第一个(最左边的).,如果它以 m.

结尾,则抓取它后面的所有文本

你需要

> sub("\.[^.]*m$", "", strings)
[1] "x"            "pm2.5.median" "rmin"         "rmin"         "rmax" 

此处,\.[^.]*m$ 匹配 .,然后匹配 0 个或多个除点以外的字符,然后匹配字符串末尾的 m

参见regex demo

详情

  • \. - 一个点(必须转义,否则它是一个特殊的正则表达式字符)
  • [^.]* - 否定字符 class 匹配任何字符但 . 0 次或更多次
  • m - 一个 m 字符
  • $ - 字符串结尾。