【问题标题】:How to extract string match within brackets in R?如何在R中的括号内提取字符串匹配?
【发布时间】:2020-04-18 20:23:55
【问题描述】:

我想从["a", "b"] 中提取"a", "b",其中[...] 中的内容在执行操作之前是未知的。所以[...] 是唯一的标识符。

通常,提取的工作方式类似于

stringr::str_match(string = ["a", "b"]', pattern = "LEFT(.*?)RIGHT")

所以我必须找到一些东西:

stringr::str_match(string = '["a", "b"]', pattern = "[(.*?)]")

但我猜必须避开括号。

stringr::str_match(string = '["a", "b"]', pattern = "[[](.*?)[]]")

可能,现在括号被转义了,但不是(.*?)

我尝试了什么:

  • 通常,我会像 [[] 一样转义括号 [ 并使用 perl = TRUE。因此,我尝试了:

    stringr::str_match(string = '["a", "b"]', pattern = "[[](.*?)[]]") 如上图。

  • 使用来自Extract string between brackets/[^[\]]+\[[^[\]]+\]/等正则表达式

【问题讨论】:

  • 您可以使用str_extract_all,即str_extract_all(string, "[A-Za-z]")
  • 由于您只是基于[] 模式提取内容,因此您只需像这样正确地转义括号:stringr::str_match(string = "sss[a, b]sss", pattern = "\\[(.*?)\\]")
  • 很好,谢谢!
  • 您错过的只是 ICU 正则表达式需要在字符类中转义 ][。所以,你只需要stringr::str_match(string = '["a", "b"]', pattern = "\\[(.*?)]")[,2]

标签: r regex


【解决方案1】:

我们可以使用str_replace 直接提取元素

library(stringr)    
str_replace(str2, "\\[([^]]+)\\].*", "\\1")
#[1] "\"a\", \"b\""

str_match

str_match(str2, "\\[([^]]+)")[,2]
#[1] "\"a\", \"b\""

数据

str2 <- '["a", "b"]'

【讨论】:

  • 感谢@akrun 的快速回复。如果我没记错的话,它只会提取字母而不是全文。所需的输出是"a", "b"。我试图修改您对[.*?] 的回答,但我不确定它是否正确。
  • @Tlatwork 你也想要引号吗(更新了答案)
【解决方案2】:

你也可以使用str_extract和正向的lookbehind和lookahead:

str_extract(str1, "(?<=\\[).*(?=\\])")

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 2016-08-19
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2020-11-13
    • 2021-09-02
    相关资源
    最近更新 更多