我有一个数据文件,其文本格式如下:
“名字:亚历克斯时代:27职业:它”
我想在':'之间提取数据(它应该在“:”之前排除前面的字段名称,例如name,age和profession是应该检索的唯一对应值。令牌名称不相同;它们可以改变。)
我想要数据
alex 27 it
答案 0 :(得分:1)
我们可以使用gsub
来匹配单词(\\w+
),然后使用:
,一个或多个空格(\\s+
),然后将一个单词作为一组捕获( (\\w+)
)并将其替换为反向引用。
gsub("\\w+:\\s+(\\w+)", "\\1", str1)
#[1] "alex 27 it"
注意:在这里,我们假设字符串的模式是key: value
对
答案 1 :(得分:0)
使用带有负回顾的str_split正则表达式可以将文本拆分为三个向量
st <- "name: alex age: 27 profession: it"
str_split(st,"(?<!:) ")
之后很容易删除gsub
我们不想要的文本str_split(st,"(?<!:) ") %>% unlist() %>% gsub("^.*: ","",.)
现在使用相同的技术,但提取名称和使用setNames我们得到一个命名列表,非常适合使用
dta <- setNames(
str_split(st,"(?<!:) ") %>%
unlist() %>%
gsub("^.*: ","",.) %>%
as.list(),
str_split(st,"(?<!:) ") %>%
unlist() %>%
gsub(":.*$","",.))
dta$profession
[1] "it"
答案 2 :(得分:0)
A solution with str_extract_all
from stringr
. This matches alphanumerics ([[:alnum:]]
) that are followed by a :
and a space (\\s
) and ends at a word boundary (\\b
):
library(stringr)
str_extract_all(string, "(?<=:\\s)[[:alnum:]]+\\b")[[1]]
# [1] "alex" "27" "it"
or:
paste(str_extract_all(string, "(?<=:\\s)[[:alnum:]]+\\b")[[1]], collapse = " ")
# [1] "alex 27 it"