R正则表达式在分隔符之间搜索文本

时间:2017-11-08 12:36:54

标签: r regex

我有一个数据文件,其文本格式如下:

  

“名字:亚历克斯时代:27职业:它”

我想在':'之间提取数据(它应该在“:”之前排除前面的字段名称,例如name,age和profession是应该检索的唯一对应值。令牌名称不相同;它们可以改变。)

我想要数据

  

alex 27 it

3 个答案:

答案 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"