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

时间:2019-02-15 21:13:58

标签: r regex gsub string-substitution

我有以下字符向量,而不需要用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"

2 个答案:

答案 0 :(得分:4)

匹配一个点,任意数量的数字m和字符串的结尾,并将其替换为空字符串。请注意,此处我们更喜欢sub而不是gsub,因为我们只希望每个字符串替换一个。

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

答案 1 :(得分:2)

.*模式匹配任意0个或更多字符,并尽可能匹配。 \..*m$模式与字符串中的第一个(最左边的).相匹配,如果它以m结尾,则抓取其后的所有文本。

您需要

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

在这里,\.[^.]*m$匹配.,然后是0个或多个除点号之外的字符,然后是字符串末尾的m

请参见regex demo

详细信息

  • \.-点(必须转义,因为它是特殊的正则表达式字符)
  • [^.]*-否定的字符类,与除.之外的0个或更多字符相同的任何字符
  • m-一个m字符
  • $-字符串的结尾。