【问题标题】:stringr::str_view() and tidyr::extract() regular expression differences?stringr::str_view() 和 tidyr::extract() 正则表达式的区别?
【发布时间】:2017-04-26 04:15:23
【问题描述】:

我正在尝试使用 tidyr::extract() 从表中提取具有多个键:值对的列。我已经使用 stringr::str_view() 微调了我的正则表达式,但我遇到了意外的行为 - tidyr::extract() 似乎匹配的字符串与 stringr::str_view() 不同。

如何修改对 tidyr::extract() 的使用以获得我想要的行为?

示例:

library(tidyverse)
library(stringr)

df <- as_data_frame('protein_id "ENSP00000260585.7"; tag "basic"; tag "appris_principal"; tag "CCDS"; tag "seleno"; ccdsid "CCDS46240.1"; havana_gene "OTTHUMG00000151931.3"; havana_transcript "OTTHUMT00000324484.3";')

# match I expect: 'tag "basic"; tag "appris_principal"; tag "CCDS"; tag "seleno"; '
str_view(df$value, '(tag "(?:.+?)"; +)+')

# match I get: 'tag \"seleno\"; '
(df %>% extract(value, "tags", '(tag "(?:.+?)"; +)+', remove = FALSE))$tags

我想将这组 4 个标签 key:values 提取到一个名为 tags 的新列中,然后我将对其进行更多整理。但是,当我只从提取物中得到 4 对中的 1 对时,这很难!

我认为我上面的 cmets 很清楚,但为了以防万一翻译我的正则表达式来描述我的意图有帮助,我将其解释为:我想匹配 0 个或多个重复的 'tag "(0 个或更多chars, 惰性求值)";(可选空格)'(贪婪求值)。

【问题讨论】:

    标签: r tidyr stringr tidyverse


    【解决方案1】:

    啊 - 它与贪婪与懒惰有关,以及 extract() “将每个 [capture] 组变成一个新列”这一事实。所以我只需要一个捕获组:

    > (df %>% extract(value, "tags", '((?:tag "(?:.+?)"; +)+)', remove = FALSE))$tags
    
    [1] "tag \"basic\"; tag \"appris_principal\"; tag \"CCDS\"; tag \"seleno\"; "
    

    正则表达式...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 2016-11-18
      • 2012-02-22
      • 2023-04-07
      • 2016-09-09
      • 2018-09-06
      相关资源
      最近更新 更多