【问题标题】:Using gsub to replace last occurence of string in R使用 gsub 替换 R 中最后出现的字符串
【发布时间】:2019-02-15 21:13:57
【问题描述】:

我需要使用 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"

【问题讨论】:

  • 请查看下面的答案并考虑接受最适合您的答案。

标签: r regex gsub string-substitution


【解决方案1】:

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

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

【讨论】:

  • 这对我也有用。谢谢!为什么偏爱sub 而不是gsub
  • 我已经添加了解释。
【解决方案2】:

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

你需要

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

这里,\.[^.]*m$ 匹配 .,然后是 0 个或多个字符而不是点,然后是字符串末尾的 m

请参阅regex demo

详情

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

【讨论】:

  • Wiktor 你能说出你为什么使用这种模式[^.]* 而不是\\d+,就像 G.Grothendieck 的回答那样吗? IE。这里有什么优势? (我还是一个正则表达式初学者)
  • @markus 从当前的样本输入数据来看,字符串是句点分隔的字符串。应该匹配的. 是字符串中的最后一个点。所以,关键是匹配到字符串末尾没有点的点,[^.]* 适合这个需求。如果在最后一个 . 和最后一个 m 之间可能有其他字符,则更好。
猜你喜欢
  • 2021-10-30
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多