从R中的字符串中提取对象数组[重复]

Posted

技术标签:

【中文标题】从R中的字符串中提取对象数组[重复]【英文标题】:Extract array of objects from string in R [duplicate] 【发布时间】:2020-04-22 20:23:50 【问题描述】:

假设我有以下字符串:

str <- "var x = 1; var b = [a:c, d:f, aa:cc, dd:ff]; var notOfInterest = cc:r, dd:w"

我想提取该数组“[..., ...]”中的所有对象,而不是单个对象“...”(在本例中:var notOfInterest)。

所需的输出:

> list(c("a:c, d:f", "aa:cc, dd:ff"))
[[1]]
[1] "a:c, d:f"     "aa:cc, dd:ff"

我尝试了什么:

在此问题/答案的基础上:find json in string with R 我尝试添加括号。 我尝试使用调整后的输入字符串: str2 &lt;- "var x = 1; var b = [a:c, d:f]; var notOfInterest = cc:r, dd:w" (仅出于调试目的。str 仍然是我的目标字符串)。连那一步都行不通。之后我必须添加一个可选的逗号并允许对象多次出现。

gregexpr(
  pattern = "[\\(?:[^]|(?R))*?\\]",
  perl = TRUE,
  text = str
) %>%
  regmatches(x = str)

我尝试使用“fixed = TRUE”参数,转义括号和一些其他选项,我很乐意发布代码,但是 我想这个问题会变得太长。

【问题讨论】:

【参考方案1】:

我们可以使用gsubgrep

strsplit(gsub(".*\\[|\\]", "", grep("\\,", strsplit(str, ";")[[1]], 
            value = TRUE)), ", (?=\\)", perl = TRUE)
#[[1]]
#[1] "a:c, d:f"     "aa:cc, dd:ff"

另一个选项是rm_square 来自qdapRegex

library(qdapRegex)
rm_square(str, extract = TRUE)
#[[1]]
#[1] "a:c, d:f, aa:cc, dd:ff"

【讨论】:

【参考方案2】:

你可以使用这样的 stringr 包来做到这一点;

library(stringr)
str <- "var x = 1; var b = [a:c, d:f, aa:cc, dd:ff]; var notOfInterest = cc:r, dd:w"

只匹配第一次出现,结果将是向量

str_extract(str, "(?<=\\[).+?(?=\\])")
# [1] "a:c, d:f, aa:cc, dd:ff"

要获得所有的出现和结果将是一个列表

str_extract_all(str, "(?<=\\[).+?(?=\\])")
# [[1]]
# [1] "a:c, d:f, aa:cc, dd:ff"

【讨论】:

【参考方案3】:

使用gsubstrsplit

strsplit(gsub("^.*?(\\.*?\\).*(\\.*?\\).*$", "\\1£\\2", str), "£")
# [[1]]
# [1] "a:c, d:f"     "aa:cc, dd:ff"

【讨论】:

【参考方案4】:

这是其他解决方案。

出于调试目的

注意:使用“[”和“]”需要转义为文本,因为“[”和“]”是正则表达式中的特殊正则表达式字符。

str2 <- "var x = 1; var b = [a:c, d:f]; var notOfInterest = cc:r, dd:w" 

str2 %>% regexpr(
  pattern = "\\[\\((\\s|\\S)+)\\\\]",
  perl = TRUE
) %>%
  regmatches(x = str2)
#[1] "[a:c, d:f, aa:cc, dd:ff]"

为了你的主要目的

使用gsubstrsplit

提取数组文本。

gsub(pattern = "^.+\\[(.+)\\].+$",perl = T, replacement = "\\1")

pattern = "^.+\\[(.+)\\].+$":使用“(.+)”将“[”和“]”之间的文本作为字符串组。在此示例中,字符串组将为“a:c, d:f, aa:cc, dd:ff”。

replacement = "\\1":用字符串组替换原文。

提取数组中的对象。

strsplit(split = "(?&lt;=([\\\\]))\\,\\s", perl = T)

split = "(?&lt;=([\\\\]))\\,\\s" :用“”和“”之间的“,”分割数组。
str <- "var x = 1; var b = [a:c, d:f, aa:cc, dd:ff]; var notOfInterest = cc:r, dd:w"

str %>% gsub(pattern = "^.+\\[(.+)\\].+$",
             perl = T,
             replacement = "\\1") %>% strsplit(split = "(?<=([\\\\]))\\,\\s", perl = T)
# [[1]]
# [1] "a:c, d:f"     "aa:cc, dd:ff"

希望对你有帮助:)

【讨论】:

以上是关于从R中的字符串中提取对象数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将对象属性的所有值提取到 Typescript 中的新数组 [重复]

如何从字符串中提取带有“”的对象[重复]

如何从数组中的对象的某些键中提取值

如何从 React 中的嵌套对象数组中提取数据?

从 JSON 数组中的字符串中提取字段

从 C# 中的 JSON 对象中提取数组(新