对于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}"

[EDIT]:在@Allan Cameron的第一个响应之后,我补充说,我的最终目标是检测在任意长度的字符向量中找到的所有可能的[:digit:]-[:alpha:]个模式,我知道它的元素理论上只嵌入[:digit:][:alpha:]个字符(这是一个简化,但这个问题的解决方案在很大程度上已经足够了).请说:

input_vector2 <- 1000L
input_vector2 <- c("123abc", "456efg", ..., "zz6ab8") # this line is illustrative, just imagine a 1000L character vector 

如果可能的话,我真正想要的是一个函数,它返回input_vector2的元素级[:Digit:]-[:Alpha:] struct :

myfunc(input_vector2)

> [1] "[:digit:]{3}[:alpha:]{3}" # (or any way to tell there is three consecutive [:digit:] then three consecutive [:alpha:])
  [2] "[:digit:]{3}[:alpha:]{3}"
  ...
  [1000] "[:alpha:]{2}[:digit:][:alpha:]{2}[:digit:]"

Thanks in all cases!
Daniel

我试图搜索现有的堆栈溢出相关主题,但找不到解决方案,也找不到解决方案的提示.

我想不出任何我知道的R函数/技巧可以得到上面提到的期望输出.

推荐答案

1) Base R如果只是一大堆匹配的字母或数字,则将每个字符串拆分成单个字符,将字母和数字分别替换为一个模式,运行rle以获得游程长度,将其重新组合在一起并删除{1}个匹配项.不使用任何套餐.

input_vector |>
  strsplit("") |>
  lapply(\(x) sub("^[[:alpha:]]$", "[[:alpha:]]", x)) |>
  lapply(\(x) sub("^[[:digit:]]$", "[[:digit:]]", x)) |>
  lapply(rle) |>
  sapply(\(x) with(x, sprintf("%s{%d}", values, lengths)) |>
     paste(collapse = "")) |>
  gsub("{1}", "", x = _, fixed = TRUE)

[1] "[[:digit:]]{3}[[:alpha:]]{3}" "[[:digit:]]{3}[[:alpha:]]{3}"
[3] "[[:alpha:]]{3}[[:digit:]]{3}" "[[:alpha:]]{3}[[:digit:]]{3}"

2) gsubfn创建一个函数gen_pat,该函数在各个参数中给出一个字母或数字字符串,输出与其匹配的模式,然后从gsubfn重复调用它.两个捕获组通过alphadigit参数传递给gen_pat,正则表达式确保其中只有一个具有非零数的字符.

library(gsubfn)

gen_pat <- function(alpha, digit) {
  if (nzchar(alpha)) sprintf("[[:alpha:]]{%d}", nchar(alpha))
  else sprintf("[[:digit:]]{%d}", nchar(digit))
}

input_vector |>
  gsubfn("([[:alpha:]]+)|([[:digit:]]+)", gen_pat, x = _) |>
  gsub("{1}", "", x = _, fixed = TRUE)

注意事项

来自问题的输入

input_vector <- c("123abc", "456efg", "hij789", "lmn000")

R相关问答推荐

给定R中另一行中的值,如何插补缺失值

使用gggplot 2在R中重新调整面板和y轴文本大小

如果索引重复,聚合xts核心数据

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

如何使用shinyChatR包配置聊天机器人

如何修复R码的置换部分?

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

使用整齐的计算(curl -curl )和杂音

非线性混合效应模型(NLME)预测变量的置信区间

将. xlsx内容显示为HTML表

如何通过匹配R中所有可能的组合来从宽到长旋转多个列?

为什么我使用geom_density的绘图不能到达x轴?

悬崖三角洲超大型群数计算导致整数溢出

汇总数据帧中的复制列,保持行的唯一性

有没有可能用shiny 的书签恢复手风琴面板?

在具有多个响应变量的比例堆叠条形图上方添加总计

如何阻止围堵地理密度图?

以任意顺序提取具有多个可能匹配项的组匹配项

使用其他DF中的文件名将列表中的每个元素保存到文件中

根据用户输入更改标记大小和 colored颜色 (R)