如何只在R中的复杂字符串中保留信息?

时间:2017-01-06 19:22:19

标签: r regex split gsub

我想在复杂的字符串中保留一串字符。我认为我可以使用正则表达式来保留我需要的东西。基本上,我希望仅保留\"\"Function=\"SMAD5\"之间的信息。我还想保留空字符串:Function=\"\"

df=structure(1:6, .Label = c("ID=Gfo_R000001;Source=ENST00000513418;Function=\"SMAD5\";", 
"ID=Gfo_R000002;Source=ENSTGUT00000017468;Function=\"CENPA\";", 
"ID=Gfo_R000003;Source=ENSGALT00000028134;Function=\"C1QL4\";", 
"ID=Gfo_R000004;Source=ENSTGUT00000015300;Function=\"\";", "ID=Gfo_R000005;Source=ENSTGUT00000019268;Function=\"\";", 
"ID=Gfo_R000006;Source=ENSTGUT00000019035;Function=\"\";"), class = "factor")

这应该是这样的:

"SMAD5"
"CENPA"
"C1QL4"
NA
NA
NA

到目前为止我能做的事情:

gsub('.*Function=\"',"",df)

[1] "SMAD5\";" "CENPA\";" "C1QL4\";" "\";"      "\";"      "\";"     

但是我被一堆\";"困住了。如何用一行删除它们?

我试过了:

gsub('.*Function=\"' & '.\"*',"",test)

但它给了我这个错误:

Error in ".*Function=\"" & ".\"*" : 
  operations are possible only for numeric, logical or complex types

3 个答案:

答案 0 :(得分:2)

您可以使用

gsub(".*Function=\"([^\"]*).*","\\1",df)

请参阅regex demo

<强>详情:

  • .* - 任意多个字符,尽可能多到最后......
  • Function=\" - Function="子字符串
  • ([^\"]*) - 捕获第1组,匹配除"
  • 以外的0 +字符
  • .* - 以及其他字符串。

\1是在结果中恢复第1组内容的反向引用。

答案 1 :(得分:1)

使用stringr,我们也可以捕获组:

library(stringr)
matches <- str_match(df, ".*\"(.*)\".*")[,2]
ifelse(matches=='', NA, matches)
# [1] "SMAD5" "CENPA" "C1QL4" NA      NA      NA     

答案 2 :(得分:0)

使用rebus可以更容易地构建正则表达式。

rx <- 'Function="' %R% 
  capture(zero_or_more(negated_char_class('"')))

然后匹配就像Wiktor和sandipan所提到的那样。

rx <- 'Function="' %R% capture(zero_or_more(negated_char_class('"')))
str_match(df, rx)
stri_match_first_regex(df, rx)

gsub(any_char(0, Inf) %R% rx %R% any_char(0, Inf), REF1, df)