是否存在R函数可提取字符向量对应的正则模式?
问题
给定一个仅由数字([:digit:])或字母([:alpha:])组成的任意长度R字符向量,示例如下:
input_vector <- c("123abc", "456efg", "hij789", "lmn000")
需要实现函数myfunc(),逐元素返回每个字符串的正则结构,预期输出为:
myfunc(input_vector) #> [1] "[:digit:]{3}[:alpha:]{3}" "[:digit:]{3}[:alpha:]{3}" "[:alpha:]{3}[:digit:]{3}" #> [4] "[:alpha:]{3}[:digit:]{3}"
需支持处理长度为1000的长向量,高效生成每个元素的数字-字母结构。
解决方案
以下提供两种实现方式,均能高效处理长向量:
方法1:依赖stringr和purrr包(简洁易读)
先安装并加载依赖包:
install.packages(c("stringr", "purrr")) library(stringr) library(purrr)
定义函数:
myfunc <- function(vec) { map_chr(vec, function(x) { # 拆分字符串为单个字符 chars <- str_split(x, "")[[1]] # 按数字/字母分组,获取连续段的类型和长度 group_info <- rle(str_detect(chars, "\\d")) # 生成每段的正则结构并拼接 paste(map2_chr(group_info$values, group_info$lengths, function(is_digit, len) { type <- ifelse(is_digit, "[:digit:]", "[:alpha:]") paste0(type, "{", len, "}") }), collapse = "") }) }
方法2:纯基础R实现(无额外包依赖)
myfunc <- function(vec) { sapply(vec, function(x) { chars <- strsplit(x, "")[[1]] # 判断每个字符是否为数字 is_digit_flag <- grepl("\\d", chars) # 获取连续相同类型的分组信息 rle_result <- rle(is_digit_flag) # 构建每段的正则结构字符串 segment_strings <- mapply(function(is_digit, len) { type <- if(is_digit) "[:digit:]" else "[:alpha:]" paste0(type, "{", len, "}") }, rle_result$values, rle_result$lengths) # 拼接所有段得到最终结果 paste(segment_strings, collapse = "") }, USE.NAMES = FALSE) }
测试验证
运行示例输入:
input_vector <- c("123abc", "456efg", "hij789", "lmn000") myfunc(input_vector)
输出符合预期:
[1] "[:digit:]{3}[:alpha:]{3}" "[:digit:]{3}[:alpha:]{3}" "[:alpha:]{3}[:digit:]{3}" [4] "[:alpha:]{3}[:digit:]{3}"
内容的提问来源于stack exchange,提问作者Daniel Rakotomalala
相关产品推荐
相关产品推荐

