【问题标题】:Regular expression: extract string between two characters/strings正则表达式:在两个字符/字符串之间提取字符串
【发布时间】:2019-02-10 18:04:21
【问题描述】:

我有一个模型公式(作为字符串)并且想要提取特定参数的值,在我的例子中是 id。现在我找到了一种返回字符串 而没有 所需字符串值的方法。我想要完全相反,我想要我的结果中缺少的字符串值:

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 作为结果字符串...谁能帮我找到正确的正则表达式模式?

【问题讨论】:

  • 这样就可以了:sub(".*id ?= ?(.*?),.*", "\\1", xx)。您需要匹配整个字符串。
  • 像魅力一样工作,非常感谢!

标签: r regex formula


【解决方案1】:

您可以使用parse() 字符串代替正则表达式并按名称获取id 参数。

as.character(parse(text = xx)[[1]]$id)
# [1] "wool"

【讨论】:

  • 谢谢,这也是一个优雅的解决方案!
【解决方案2】:

你可以使用

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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2014-06-12
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多