我有这样一句话:
system<-c("System configuration: type=Shared mode=Uncapped smt=4 lcpu=96 mem=393216MB psize=64 ent=16.00")我需要把它解析出来,然后选择smt、lcpu、mem、mpsize和ent到不同的对象中。
例如,我这样做是为了选择smt,但它选择了整个行,你知道我在这里做错了什么吗?
smt<-sub('^.* smt=([[:digit:]])', '\\1', system)在这种情况下,smt需要有一个数字4。
发布于 2013-04-18 02:25:03
将.*添加到匹配表达式的末尾,您将得到"4“。
sub('^.* smt=([[:digit:]]+).*', '\\1', system) 您可能希望将我包含在实例中的+添加到超过一个数字的实例中。
您也可以通过拆分空格并查找匹配项来实现此目的:
splits <- unlist(strsplit(system, ' '))
sub('smt=', '', grep('smt=', splits, value=TRUE))
# [1] "4"或者将其包装在一个函数中:
matchfun <- function(string, to_match, splitter=' ') {
splits <- unlist(strsplit(string, splitter))
sub(to_match, '', grep(to_match, splits, value=TRUE))
}
matchfun(system, 'smt=')
# [1] "4"发布于 2013-04-18 02:24:14
我会多次使用strsplit,而type.convert
parse.config <- function(x) {
clean <- sub("System configuration: ", "", x)
pairs <- strsplit(clean, " ")[[1]]
items <- strsplit(pairs, "=")
keys <- sapply(items, `[`, 1)
values <- sapply(items, `[`, 2)
values <- lapply(values, type.convert, as.is = TRUE)
setNames(values, keys)
}
config <- parse.config(system)
# $type
# [1] "Shared"
#
# $mode
# [1] "Uncapped"
#
# $smt
# [1] 4
#
# $lcpu
# [1] 96
#
# $mem
# [1] "393216MB"
#
# $psize
# [1] 64
#
# $ent
# [1] 16输出是一个列表,因此您可以访问任何已解析的项,例如:
config$smt
# [1] 4发布于 2013-04-18 04:19:04
下面在gusbfn package中使用strapplyc创建一个列表L,它的名称是左侧,比如smt,值是右侧。
library(gsubfn)
LHS <- strapplyc( system, "(\\w+)=" )[[1]]
RHS <- strapplyc( system, "=(\\w+)" )[[1]]
L <- setNames( as.list(RHS), LHS )例如,我们现在可以像这样获得smt (对于其他左侧也是如此):
> L$smt
[1] "4"更新:简化。
https://stackoverflow.com/questions/16067058
复制相似问题