R语言中如何补零生成符合指定正则格式的字符串?
R语言实现补零格式化日期时间字符串
可以通过正则匹配+补零填充的方式高效实现需求,以下提供两种方案:base R原生实现(无需额外包)和stringr包实现(代码更直观)。
需求分析
需要将输入字符串转换为\d{4}-\d{2}-\d{2};\d{2}:\d{2}:\d{2}格式:
- 分号前为日期段:按
-拆分后,分别补零到4位、2位、2位,缺失段补零(如无日期段则补0000-00-00) - 分号后为时间段:按
:拆分后,分别补零到2位,缺失段补零(如无时间段则补00:00:00)
方案1:base R原生实现
无需加载任何扩展包,利用strsplit、sprintf实现向量化处理:
input <- c("1456-3-13;11:56:98", "45:76:12", "981-56-54;11") process_str <- function(x) { # 拆分日期与时间部分 split_sep <- strsplit(x, ";")[[1]] date_seg <- if (length(split_sep) >= 1) split_sep[1] else "" time_seg <- if (length(split_sep) >= 2) split_sep[2] else "" # 处理日期段:补零到4-2-2格式 date_parts <- strsplit(date_seg, "-")[[1]] date_parts <- c(date_parts, rep("", max(0, 3 - length(date_parts)))) date_formatted <- sprintf("%04s-%02s-%02s", date_parts[1], date_parts[2], date_parts[3]) date_formatted <- gsub(" ", "0", date_formatted) # 处理时间段:补零到2-2-2格式 time_parts <- strsplit(time_seg, ":")[[1]] time_parts <- c(time_parts, rep("", max(0, 3 - length(time_parts)))) time_formatted <- sprintf("%02s:%02s:%02s", time_parts[1], time_parts[2], time_parts[3]) time_formatted <- gsub(" ", "0", time_formatted) paste(date_formatted, time_formatted, sep = ";") } # 批量处理输入向量 output <- sapply(input, process_str, USE.NAMES = FALSE) output
运行结果:
[1] "1456-03-13;11:56:98" "0000-00-00;45:76:12" "0981-56-54;11:00:00"
方案2:stringr包实现
利用stringr的正则替换和填充函数,代码更简洁易读:
library(stringr) input <- c("1456-3-13;11:56:98", "45:76:12", "981-56-54;11") # 拆分日期与时间部分 split_parts <- str_split_fixed(input, ";", 2) date_seg <- split_parts[, 1] time_seg <- split_parts[, 2] # 处理日期段 processed_date <- case_when( date_seg == "" ~ "0000-00-00", str_count(date_seg, "-") == 2 ~ str_replace_all(date_seg, "(\\d*)-(\\d*)-(\\d*)", function(m) str_c(str_pad(m[2],4,"0"), str_pad(m[3],2,"0"), str_pad(m[4],2,"0"), sep="-")), str_count(date_seg, "-") == 1 ~ str_replace(date_seg, "(\\d*)-(\\d*)", function(m) str_c(str_pad(m[2],4,"0"), str_pad(m[3],2,"0"), "00", sep="-")), TRUE ~ str_replace(date_seg, "(\\d*)", function(m) str_c(str_pad(m[2],4,"0"), "00", "00", sep="-")) ) # 处理时间段 processed_time <- ifelse(time_seg == "", "00:00:00", str_replace_all(time_seg, "(\\d*)(?::(\\d*))?(?::(\\d*))?", function(m) { parts <- c(str_pad(m[2],2,"0"), str_pad(m[3],2,"0"), str_pad(m[4],2,"0")) str_c(parts, collapse = ":") })) # 合并结果 output <- str_c(processed_date, processed_time, sep = ";") output
运行结果与方案1一致。
内容的提问来源于stack exchange,提问作者Ai4l2s
相关产品推荐
相关产品推荐

