我有一个向量,其中每个元素都是字符串。我只想保留字符串的一部分,就在'=='之前,不管它是否在字符串的开头,在&符号,或者在符号之后。以下是我的数据:
data <- c("name=='John'", "name=='David'&age=='50'|job=='Doctor'&city=='Liverpool'",
"job=='engineer'&name=='Andrew'",
"city=='Manchester'", "age=='40'&city=='London'"
)
我的理想格式是这样的:
[1] "name"
[2] "name" "age" "job" "city"
[3] "job" "name"
[4] "city"
[5] "age" "city"
我所得到的最接近的是使用qdap库中的genXtract,它将数据置于上述格式,但我只知道如何在一个条件下使用它,即
qdap::genXtract(data, "&", "==")
但我不只是想要&和==,但也可以在|和==之间或字符串的开头和==
这个正则表达式的作用是捕获==
出现之前的所有a-zA-Z0-9(=字母和数字)。
stringr::str_extract_all( data, "[0-9a-zA-Z]+(?=(==))")
[[1]]
[1] "name"
[[2]]
[1] "name" "age" "job" "city"
[[3]]
[1] "job" "name"
[[4]]
[1] "city"
[[5]]
[1] "age" "city"
如果希望输出为矢量,则使用
L <- stringr::str_extract_all( data, "[0-9a-zA-Z]+(?=(==))" )
unlist( lapply( L, paste, collapse = " " ) )
在搜索结果
[1] "name"
[2] "name age job city"
[3] "job name"
[4] "city"
[5] "age city"
在base R
中,可以使用regmatches/gregexpr
lst1 <- regmatches(data, gregexpr("\w+(?=\={2})", data, perl = TRUE))
sapply(lst1, paste, collapse = " ")
#[1] "name"
#[2] "name age job city"
#[3] "job name"
#[4] "city"
#[5] "age city"