是否有一个 R 函数可以输出在输入的字符向量中找到的相应正则表达式模式?

Dan*_*ala 2 regex string r

对于 R,假设我有以下字符向量:

input_vector <- c("123abc", "456efg", "hij789", "lmn000")
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个现有的函数,例如myfunc(),可以输出我的向量后面的正则表达式模式。换句话说:

myfunc(input_vector)

> [1] "[:digit:]{3}[:alpha:]{3}" "[:digit:]{3}[:alpha:]{3}" "[:alpha:]{3}[:digit:]{3}" 
  [4] "[:alpha:]{3}[:digit:]{3}"
Run Code Online (Sandbox Code Playgroud)

[编辑]:在@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 
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我真正想要的是一个返回以下元素的 [:digit:]-[:alpha:] 结构的函数input_vector2

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:]"
Run Code Online (Sandbox Code Playgroud)

在所有情况下都表示感谢!
丹尼尔

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

我想不出任何我知道的 R 函数/技巧可以让我得到上面提到的所需输出。

G. *_*eck 5

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)
Run Code Online (Sandbox Code Playgroud)

给予

[1] "[[:digit:]]{3}[[:alpha:]]{3}" "[[:digit:]]{3}[[:alpha:]]{3}"
[3] "[[:alpha:]]{3}[[:digit:]]{3}" "[[:alpha:]]{3}[[:digit:]]{3}"
Run Code Online (Sandbox Code Playgroud)

2) gsubfn创建一个函数gen_pat,在相应参数中给出字母或数字字符串,输出与其匹配的模式,然后从 中重复调用它gsubfn。两个捕获组被传递给gen_patviaalphadigit参数,并且正则表达式确保只有其中之一具有非零数量的字符。

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)
Run Code Online (Sandbox Code Playgroud)

笔记

从问题输入

input_vector <- c("123abc", "456efg", "hij789", "lmn000")
Run Code Online (Sandbox Code Playgroud)