2017-04-26 4 views
0

私はtidyr :: extract()でテーブルから複数のkey:valueのペアを持つ列を抽出しようとしています。私は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

ああ - それは欲張りvs怠惰なテイクと、extract()が各[キャプチャ]グループを新しい列にするという事実と関係がある。

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

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

正規表現...

:だから、僕は、単一のキャプチャグループを必要とします
関連する問題