从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 <- "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】:我们可以使用gsub
和grep
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】:使用gsub
和strsplit
。
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]"
为了你的主要目的
使用gsub
和strsplit
提取数组文本。
gsub(pattern = "^.+\\[(.+)\\].+$",perl = T, replacement = "\\1")
pattern = "^.+\\[(.+)\\].+$"
:使用“(.+)”将“[”和“]”之间的文本作为字符串组。在此示例中,字符串组将为“a:c, d:f, aa:cc, dd:ff”。
replacement = "\\1"
:用字符串组替换原文。
提取数组中的对象。
strsplit(split = "(?<=([\\\\]))\\,\\s", perl = T)
split = "(?<=([\\\\]))\\,\\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中的字符串中提取对象数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章