我正在使用 R v4.0.0 和stringi. 這是一個示例字串:
tstr1 <- 'gene_id "APE_RS08740"; transcript_id "unassigned_transcript_1756"; gbkey "CDS"; inference "COORDINATES: protein motif:HMM:NF014037.1"; locus_tag "APE_RS08740"; note "incomplete; partial in the middle of a contig; missing N-terminus"; partial "true"; product "DUF5615 family PIN-like protein"; pseudo "true"; transl_table "11"; exon_number "1"'
我想通過首先匹配變數模式var然后提取所有內容直到下一個分號來提取帶引號的子字串。我想避免var在帶引號的子字串中匹配的實體。到目前為止,我有這個:
library(stringi)
library(dplyr)
var <- "partial"
str_extract(string = tstr1, pattern = paste0('"; ', var, '[^;] ')) %>%
gsub(paste0("\"; ", var), "", .) %>%
gsub("\"", "", .) %>% trimws()
這將回傳"true",這是我想要的輸出。但是,我需要一個也適用于兩種邊緣情況的正則運算式:
情況1
Whenvar位于字串的開頭,我不能依靠前面的"; 來匹配。
tstr2 <- 'partial "true"; gene_id "APE_RS08740"; transcript_id "unassigned_transcript_1756"; gbkey "CDS"; infernce "COORDINATES: protein motif:HMM:NF014037.1"; locus_tag "APE_RS08740"; note "incomplete; partial in the middle of a contig; missing N-terminus"; product "DUF5615 family PIN-like protein"; pseudo "true"; transl_table "11"; exon_number "1"'
預期輸出: "true"
案例二
當要提取的帶引號的子字串包含分號時,我希望匹配所有內容,直到下一個不在帶引號的子字串內的分號。
tstr3 <- 'partial "true; foo"; gene_id "APE_RS08740"; transcript_id "unassigned_transcript_1756"; gbkey "CDS"; infernce "COORDINATES: protein motif:HMM:NF014037.1"; locus_tag "APE_RS08740"; note "incomplete; partial in the middle of a contig; missing N-terminus"; product "DUF5615 family PIN-like protein"; pseudo "true"; transl_table "11"; exon_number "1"'
預期輸出: "true; foo"
uj5u.com熱心網友回復:
|對于“部分”沒有任何前面的"或的情況,我們可以使用 OR ( ) 條件;,然后提取兩者之間的字符"
library(stringr)
str_extract(tstr, sprintf('";\\s %1$s[^;] |^%1$s[^;] ;[^"] "', var)) %>%
trimws(whitespace = '["; ] ', which = 'left') %>%
str_extract('(?<=")[^"] (?=")')
-輸出
[1] "true" "true" "true; foo"
資料
tstr <- c(tstr1, tstr2, tstr3)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/354138.html
上一篇:僅轉置某些列-資料格式
