对于 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 函数/技巧可以让我得到上面提到的所需输出。
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_patviaalpha和digit参数,并且正则表达式确保只有其中之一具有非零数量的字符。
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)