【问题标题】:R Regex searching text between delimiterR 正则表达式在分隔符之间搜索文本
【发布时间】:2017-11-08 12:36:54
【问题描述】:

我有一个数据文件,其中包含以下格式的文本:

“姓名:alex 年龄:27 职业:it”

我想提取 ':' 之间的数据(它应该排除 ":" 之前的前面的字段名称,例如姓名、年龄和职业是应该检索的唯一对应值。令牌名称不一样;它们可以改变。)

我希望数据是

亚历克斯 27 它

【问题讨论】:

  • 你已经尝试了什么?
  • 看看stringr::str_split

标签: r regex


【解决方案1】:

我们可以使用gsub来匹配单词(\\w+),然后是:,一个或多个空格(\\s+),然后是一个被捕获为一个组的单词((\\w+))并将其替换为反向引用。

gsub("\\w+:\\s+(\\w+)", "\\1", str1)
#[1] "alex 27 it"

注意:这里,我们假设字符串的模式在key: value 对中

【讨论】:

    【解决方案2】:

    使用带有负回溯正则表达式的 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"
    

    【讨论】:

      【解决方案3】:

      str_extract_all 的解决方案来自stringr。这匹配字母数字 ([[:alnum:]]),后跟 : 和空格 (\\s),并以单词边界 (\\b) 结束:

      library(stringr)
      str_extract_all(string, "(?<=:\\s)[[:alnum:]]+\\b")[[1]]
      # [1] "alex" "27"   "it" 
      

      或:

      paste(str_extract_all(string, "(?<=:\\s)[[:alnum:]]+\\b")[[1]], collapse = " ")
      # [1] "alex 27 it"
      

      【讨论】:

      • 没有解决方案有效第二个字段数据并不总是数字它也可以是字符
      • @hari 对不起,我不明白你的意思。我的解决方案怎么不起作用?它将匹配任何后跟冒号和空格的字母数字字符。
      猜你喜欢
      • 2011-04-11
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多