stringr :: str_view()和tidyr :: extract()正则表达式的区别?

时间:2017-04-26 04:15:23

标签: r tidyr stringr tidyverse

我试图从带有tidyr :: extract()的表中提取具有多个键:值对的列。我用stringr :: str_view()调整了我的正则表达式,但是我得到了意想不到的行为 - tidyr :: extract()似乎与stringr :: str_view()匹配不同的字符串。 / p>

如何修改我对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个标记键:值提取到一个名为tags的新列中,然后我会对其进行整理。但是当我从提取物中获得4对中的1对时,这很难!

我认为我上面的评论是清楚的,但为了防止翻译我的正则表达以描述我的意图有帮助,我将其解释为:我想要匹配0或更多重复的&#39 ;标签&#34;(0或更多字符,懒惰评估)&#34 ;;(可选空间)&#39;(贪婪评估)。

1 个答案:

答案 0 :(得分:0)

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

> (df %>% extract(value, "tags", '((?:tag "(?:.+?)"; +)+)', remove = FALSE))$tags

[1] "tag \"basic\"; tag \"appris_principal\"; tag \"CCDS\"; tag \"seleno\"; "

正则表达式......