我有一个模型公式(作为字符串),并想提取特定参数id
的值。现在,我找到了一种返回字符串而没有所需字符串值的方法。我想正好相反,我 only 只想要结果中缺少的字符串值:
xx <- "gee(formula = breaks ~ tension, id = wool, data = warpbreaks)"
sub("(?=(id=|id =))([a-zA-Z].*)(?=,)", "\\1", xx, perl =T)
#> [1] "gee(formula = breaks ~ tension, id =, data = warpbreaks)"
wool
缺少返回值,但我只想将wool
作为结果字符串...有人可以帮助我找到正确的正则表达式模式吗?
答案 0 :(得分:3)
您可以parse()
代替字符串,而按名称抓取id
参数。
as.character(parse(text = xx)[[1]]$id)
# [1] "wool"
答案 1 :(得分:1)
您可以使用
xx <- "gee(formula = breaks ~ tension, id = wool, data = warpbreaks)"
sub(".*\\bid\\s*=\\s*(\\w+).*", "\\1", xx)
## or, if the value extracted may contain any chars but commas
sub(".*\\bid\\s*=\\s*([^,]+).*", "\\1", xx)
请参见R demo和regex demo。
详细信息
.*
-任意0个以上的字符,并且尽可能多\\bid
-整个单词id
(\b
是单词边界)\\s*=\\s*
-一个=
包含0+空格(\\w+)
-捕获组1(替换模式中的\\1
表示该值):一个或多个字母,数字或下划线(或[^,]+
匹配1个以上的字符,而不是逗号).*
-字符串的其余部分。其他替代解决方案:
> xx <- "gee(formula = breaks ~ tension, id = wool, data = warpbreaks)"
> regmatches(xx, regexpr("\\bid\\s*=\\s*\\K[^,]+", xx, perl=TRUE))
[1] "wool"
模式匹配id
,=
并用0+空格括起来,然后\K
忽略匹配的文本,并且,
以外的仅1+个字符进入匹配值
或者,使用stringr::str_match
的捕获方法在这里也有效:
> library(stringr)
> str_match(xx, "\\bid\\s*=\\s*([^,]+)")[,2]
[1] "wool"