You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中gsub仅捕获正则分组最后一个字符的解决问询

解决正则捕获完整数字的问题

你的问题出在正则表达式的捕获组写法上:([0-9])+ 是对单个数字字符的重复匹配,捕获组只会保留最后一次匹配的字符,而非整个数字序列,所以才会出现只截取最后一位的情况。

下面提供几种简洁的修正方案:

方案一:修正正则捕获组

把数字和小数点的组合作为整体捕获,用[0-9.]+匹配完整的数字(整数或小数):

library(dplyr)

vec <- c("(0,13.2]", "(13.2,28.3]", "(28.3,39.3]", "(39.3,49.4]", "(49.4,59.4]",
         "(59.4,69.3]", "(69.3,78.9]", "(78.9,87.8]", "(87.8,95.5]", "(95.5,100]")

vec %>%
  strsplit(",") %>%
  lapply(function(level_i){
    # 捕获开头(后的所有数字和小数点
    from <- gsub("^\\(([0-9.]+)$", "\\1", level_i[1])
    # 捕获结尾]前的所有数字和小数点
    to <- gsub("^([0-9.]+)]$", "\\1", level_i[2])
    paste0(from, " to ", to)
  }) %>%
  unlist()

方案二:用stringr简化操作(推荐)

无需拆分字符串,直接移除无关符号并替换分隔符,代码更简洁:

library(dplyr)
library(stringr)

vec %>%
  str_remove("^\\(") %>%       # 移除开头的(
  str_replace(",", " to ") %>% # 把逗号替换成" to "
  str_remove("\\]$")           # 移除结尾的]

方案三:一次性匹配两个数字组

用str_match直接从原字符串中提取两个数字部分,再拼接:

library(stringr)

matches <- str_match(vec, "^\\(([0-9.]+),([0-9.]+)\\]$")
paste0(matches[,2], " to ", matches[,3])

这三种方法都能得到你预期的结果:

# [1] "0 to 13.2"   "13.2 to 28.3" "28.3 to 39.3" "39.3 to 49.4" "49.4 to 59.4"
# [6] "59.4 to 69.3" "69.3 to 78.9" "78.9 to 87.8" "87.8 to 95.5" "95.5 to 100"

内容的提问来源于stack exchange,提问作者LulY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:29:54