2017-04-26 91 views
0

我試圖從tidyr :: extract()表中抽取一個具有多個鍵值的列:值對。我用stringr :: str_view()對正則表達式進行了微調,但是我得到了意想不到的行爲 - tidyr :: extract()似乎與stringr :: str_view()不同的字符串匹配。stringr :: str_view()和tidyr :: extract()正則表達式的區別?

如何修改我對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標記物項的提取:值到一個名爲標籤的新列,然後我更整齊些會。但是當我從提取物中得到4對中的1對時,這很難!

我認爲我上面的評論很清楚,但爲了防止翻譯我的正則表達式來描述我的意圖有所幫助,我將其解釋爲:我想匹配0個或更多個'tag'重複(0或更多的字符,懶惰的評價)「;(可選空間)」(貪婪的評價)。

回答

0

啊 - 它與貪婪vs懶惰,以及extract()「將每個[capture]組變成一個新列」的事實。所以,我只需要一個單一的捕獲組:

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

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

正則表達式...

相關問題