我想在复杂的字符串中保留一串字符。我认为我可以使用正则表达式来保留我需要的东西。基本上,我希望仅保留\"
中\"
和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
答案 0 :(得分:2)
您可以使用
gsub(".*Function=\"([^\"]*).*","\\1",df)
请参阅regex demo
<强>详情:
.*
- 任意多个字符,尽可能多到最后...... Function=\"
- Function="
子字符串([^\"]*)
- 捕获第1组,匹配除"
.*
- 以及其他字符串。 \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)