r - 带引号和分号的 str_extract 正则表达式

标签 r regex string stringi

我正在使用 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

var 位于字符串的开头并且我不能依赖前面的 "; 来匹配时。

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”

案例2

当要提取的带引号的子字符串包含分号时,我希望匹配所有内容,直到下一个分号不在带引号的子字符串内

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”

最佳答案

对于“部分”前面没有任何 "; 的情况,我们可以使用 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)

关于r - 带引号和分号的 str_extract 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69901128/

相关文章:

R:按多个列值索引到数据框

r - 将节点集合的邻居名称提取为列表

php - 如何将 "^|"作为可执行文件的参数传递?

ruby - 如何用 ruby 切割绳子

r - 从包含缩写月份和 PM(及时)的时间戳转换为日期

java - Java 中的 Project Euler #22(关闭 7 364 934)

javascript - React - 使用 Object.keys.map 迭代时检查字符串中的空格

c - 为什么这个反向字符串函数会出现段错误?

C 字符串作为链表?

r - 如何删除列表中存在的所有数据框中的列?