假设我有一个字符串"S[+229]EC[+57]VDSTDNSSK[+229]PSSEPTSHVAR"
的列表,并且需要获取一个字符串向量,该向量仅包含带有方括号的数字,例如。 [+229][+57]
。
R 中是否有方便的方法来做到这一点?
假设我有一个字符串"S[+229]EC[+57]VDSTDNSSK[+229]PSSEPTSHVAR"
的列表,并且需要获取一个字符串向量,该向量仅包含带有方括号的数字,例如。 [+229][+57]
。
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中使用regmatches
和gregexpr
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