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

是否存在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:40:11