正则表达式:提取两个字符/字符串之间的字符串

时间:2019-02-10 18:04:21

标签: r regex formula

我有一个模型公式(作为字符串),并想提取特定参数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作为结果字符串...有人可以帮助我找到正确的正则表达式模式吗?

2 个答案:

答案 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 demoregex 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"