我正在尝试从一个具有tidyr:: extract ()的表中提取一个具有多个键:值对的列。我已经用stringr::str_view()对我的正则表达式进行了微调,但我得到了意想不到的行为--tidyr::提取()似乎与stringr::str_view()匹配不同的字符串。
如何修改tidyr::提取()的用法以获得我想要的行为?
示例:
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标记键的集合:值提取到一个名为标记的新列中,然后再整理一些。但是,当我从摘录中得到4对中的1对时,这是很难的!
我认为上面的评论很清楚,但是为了避免翻译我的正则表达式来描述我的意图,我把它解释为:我想匹配'tag“的0或更多的重复(0或更多字符,懒惰的评估)”;(可选的空格)‘(贪婪的评估)。
发布于 2017-04-26 05:10:33
啊--这与贪婪与懒惰有关,而提取()“将每个捕获组变成一个新列”。所以我只需要一个捕获组:
> (df %>% extract(value, "tags", '((?:tag "(?:.+?)"; +)+)', remove = FALSE))$tags
[1] "tag \"basic\"; tag \"appris_principal\"; tag \"CCDS\"; tag \"seleno\"; "正则表达式..。
https://stackoverflow.com/questions/43624935
复制相似问题