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
相关产品推荐
相关产品推荐

