提取R中的子字符串

假设我有一个字符串"S[+229]EC[+57]VDSTDNSSK[+229]PSSEPTSHVAR"的列表,并且需要获取一个字符串向量,该向量仅包含带有方括号的数字,例如。 [+229][+57]

R 中是否有方便的方法来做到这一点?

wohenzhuce 回答:提取R中的子字符串

使用base R,然后尝试使用

> unlist(regmatches(s,gregexpr("\\[\\+\\d+\\]",s)))
[1] "[+229]" "[+57]"  "[+229]"

或者您可以使用

> gsub(".*?(\\[.*\\]).*","\\1",gsub("\\].*?\\[","] | [",s))
[1] "[+229] | [+57] | [+229]"
,

我们可以使用str_extract_all中的stringr

stringr::str_extract_all(x,"\\[\\+\\d+\\]")[[1]]
#[1] "[+229]" "[+57]"  "[+229]"

如果仅需要唯一值,则将其包装在unique中。


类似地,在基数R中使用regmatchesgregexpr

regmatches(x,x))[[1]]

数据

x <- "S[+229]EC[+57]VDSTDNSSK[+229]PSSEPTSHVAR"
,

好像您要删除字母字符,所以

scanf("%d",&count);

其中gsub("[[:alpha:]]","",x) 是字母(小写和大写)字符的类别,[:alpha:]表示“匹配任何单个字母字符”,而[[:alpha:]]表示全局替换,空字符串gsub()的任何字母字符。这似乎比尝试匹配括号中的数字要好,后者需要弄清楚需要用(double!)""来转义哪些字符。

如果要返回带括号的 ,那么方法是提取匹配项(而不是删除不需要的字符)。我将使用\\来标识匹配项,并使用gsub()来提取匹配项,而不是使用gregexpr()将匹配项替换为具有另一个值的正则表达式。由于数字总是出现在regmatches()中,因此我将简化正则表达式以匹配集合[]中的一个或多个(+)字符。

+[:digit:]

> xx <- regmatches(x,gregexpr("[+[:digit:]]+",x)) > xx [[1]] [1] "+229" "+57" "+229" 是一个长度等于xx的长度的列表。我将为该列表中的任何元素编写一个函数,使这些值唯一,并用x[包围这些值并将它们连接起来

]

这需要应用于列表的每个元素,并简化为向量,fun <- function(x) paste0("[",unique(x),"]",collapse = "") 的任务。

sapply()

使用> sapply(xx,fun) [1] "[+229][+57]" 进行了一个小的改进,使结果很健壮(总是返回长度等于vapply()的字符向量)到零长度输入

x
本文链接:https://www.f2er.com/3103600.html

大家都在问