regex - 捕获组可以嵌套在非捕获组中吗

标签 regex r

我尝试在 R 中使用类似 PERL 的正则表达式拆分 FASTA header 。

一些输入字符串的例子:

>P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B
>ENSEMBL:ENSBTAP00000024146 (Bos taurus) similar to alpha-2-macroglobulin isoform 1
>ENSEMBL:ENSBTAP00000024462 (Bos taurus) 47 kDa protein;>ENSEMBL:ENSBTAP00000024466 (Bos taurus) 44 kDa protein
>Q3SX28 TREMBL:Q3SX28;Q5KR48 (Bos taurus) Tropomyosin 2
>P00761 SWISS-PROT:P00761|TRYP_PIG Trypsin - Sus scrofa (Pig).

我想获取信息

  • 标识符(P04259、ENSBTAP00000024146、ENSBTAP00000024462、Q3SX28、P00761)
  • 如果可用基因符号,如案例 1 (KRT6B)
  • 蛋白质名称(角蛋白,II 型细胞骨架 6B,(Bos taurus)类似于 alpha-2-巨球蛋白同种型 1,(Bos taurus)47 kDa 蛋白质,(Bos taurus)原肌球蛋白 2,胰蛋白 enzyme - Sus scrofa( pig ))

我建议的正则表达式是 R 格式:

^(?:>.*?(?:ENSEMBL:|SWISS-PROT:|TREMBL:))([A-Z0-9.-]+)(?:.*?Gene_Symbol=(\\S+)|\\s+|;\\S+ |\\|\\S+)(.*?)(?:;>.*?|\\n)

和 pcre 格式:

^(?:>.*?(?:ENSEMBL:|SWISS-PROT:|TREMBL:))([A-Z0-9.-]+)(?:.*?Gene_Symbol=(\S+)|\s|;\S+ |\|\S+)(.*?)(?:;>.*?|\n)

我在 regex101.com 测试了正则表达式,结果正是我想要的。但是如果我在 R 中执行它,每个捕获组都包含完整的字符串。我认为并非每个条目都有基因符号的特殊情况会产生一些内部问题。也许我在非捕获组中嵌套了一个捕获组也是一个问题。

> gsub(pattern = regex, replacement = "\\1", x = ">P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B", perl = TRUE)
[1] ">P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B"
> gsub(pattern = regex, replacement = "\\2", x = ">P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B", perl = TRUE)
[1] ">P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B"
> gsub(pattern = regex, replacement = "\\3", x = ">P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B", perl = TRUE)
[1] ">P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B"

regex101.com 测试的结果 The result of the regex101.com tests

所以最后我想要绿色 block 、红色 block (如果可用)和橙色 block 作为结果。希望你能帮助我。

最佳答案

当您在在线正则表达式测试器中测试字符串时,您使用了多行字符串。正则表达式中的最后一个 \n 匹配换行符,因此,您匹配了 >P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B.

您只需将 \n 替换为字符串结尾 anchor 即可使其与 gsub 一起使用:

x = ">P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B"
gsub("^(?:>.*?(?:ENSEMBL:|SWISS-PROT:|TREMBL:))([A-Z0-9.-]+)(?:.*?Gene_Symbol=(\\S+)|\\s|;\\S+ |\\|\\S+)(.*?)(?:;>.*|$)", "\\1", x, perl = TRUE)
gsub("^(?:>.*?(?:ENSEMBL:|SWISS-PROT:|TREMBL:))([A-Z0-9.-]+)(?:.*?Gene_Symbol=(\\S+)|\\s|;\\S+ |\\|\\S+)(.*?)(?:;>.*|$)", "\\2", x, perl = TRUE)
gsub("^(?:>.*?(?:ENSEMBL:|SWISS-PROT:|TREMBL:))([A-Z0-9.-]+)(?:.*?Gene_Symbol=(\\S+)|\\s|;\\S+ |\\|\\S+)(.*?)(?:;>.*|$)", "\\3", x, perl = TRUE)

参见 IDEONE demo

但是,由于您想提取 文本,我建议您将正则表达式与stringr 包中的str_match 一起使用:

> library(stringr)
> x = ">P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B"
> str_match(x, "^(?:>.*?(?:ENSEMBL:|SWISS-PROT:|TREMBL:))([A-Z0-9.-]+)(?:.*?Gene_Symbol=(\\S+)|\\s|;\\S+ |\\|\\S+)(.*?)(?:;>.*|$)")
     [,1]                                                                                       [,2]     [,3]   
[1,] ">P04259 SWISS-PROT:P04259 Tax_Id=9606 Gene_Symbol=KRT6B Keratin, type II cytoskeletal 6B" "P04259" "KRT6B"
     [,4]                               
[1,] " Keratin, type II cytoskeletal 6B"

关于regex - 捕获组可以嵌套在非捕获组中吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35750411/

相关文章:

regex - 为 Perl 配置 Notepad++ "Function List"

java - 使用 DiskLruCache 时出现正则表达式错误 (Jake Wharton)

r - 使用 purrr 和 map (tidyverse) 迭代因变量

r - data.table 一次计算多列

使用正则表达式解析python字符串

python、正则表达式、命名组和 "logical or"运算符

javascript - 替换文件中的标记而不写入新文件

r - 如何在消费计划中部署适用于 R 语言的 Azure Functions 自定义处理程序?

r - 从 'mlm' 预测 `lm()` 线性模型对象

r - 如何使用ggplot2中的线将箱线图的中值与多个组连接起来?