大小等于前一个块的正则表达式搜索块
Regex search block with size equal to previous block
我想用正则表达式逐块解析 FASTQ 文件。
FASTQ 文件如下所示:
@EAS54_6_R1_2_1_413_324 // seqname
CCCTTCTTGTCTTCAGCGTTTCTCC // seq
+ // seqname #2
;;3;;;;;;;;;;;;7;;;;;;;88 // qual
@EAS54_6_R1_2_1_540_792 // seqname
TTGGCAGGCCAAGGCCGATGGATCA // seq
+ // seqname #2
;;;;;;;;;;;7;;;;;-;;;3;83 // qual
@EAS54_6_R1_2_1_443_348 // seqname
GTTGCTTCTGGCGTGGGTGGGGGGG // seq
+EAS54_6_R1_2_1_443_348 // seqname #2
;;;;;;;;;;;9;7;;.7;393333 // qual
其格式:
<fastq> := <block>+
<block> := @<seqname>\n<seq>\n+[<seqname>]\n<qual>\n
<seqname> := [A-Za-z0-9_.:-]+
<seq> := [A-Za-z\n\.~]+
<qual> := [!-~\n]+
问题是我无法检测到块的结尾(或下一个块的开始),因为 @
也在 <qual>
块中使用。但是 <qual>
块必须与 <seq>
块大小相同。
问题:是否可以编写一个组大小限制为另一个组大小的正则表达式?
喜欢这个(\2.size令牌除外):
(?:@([A-Za-z0-9_\.:-]+)\n([A-Za-z\n\.~]+)\n\+([A-Za-z0-9_.:-]*)\n([!-~\n]{.size}))*
^.....seqname.....^ ^.....seq......^ ^....seqname2....^ ^qual(should be same size as seq)^
更新:我们无法搜索 @
代币,因为它可以出现在 <qual>
区块
中
这是解析它的正则表达式:
(.*?(?=\n@[A-Z]|$)) //single-line,global
通过 (?=\n@[A-Z]|$)
前瞻,我们强制 .*?
获取所有内容直到 就在 以 '@' 开头的新行之前后跟一个(大写)字母,或输入结束
遗憾的是,无法将 a{n}b{n} 与正则表达式匹配。它需要上下文无关的语法; here's a proof.
(相反,只需匹配 name、seq 和 +,然后获取 seq 匹配的 match.size()
,然后从剩余字符串中读取接下来的 n 个字符以获得 qual。)
我想用正则表达式逐块解析 FASTQ 文件。 FASTQ 文件如下所示:
@EAS54_6_R1_2_1_413_324 // seqname
CCCTTCTTGTCTTCAGCGTTTCTCC // seq
+ // seqname #2
;;3;;;;;;;;;;;;7;;;;;;;88 // qual
@EAS54_6_R1_2_1_540_792 // seqname
TTGGCAGGCCAAGGCCGATGGATCA // seq
+ // seqname #2
;;;;;;;;;;;7;;;;;-;;;3;83 // qual
@EAS54_6_R1_2_1_443_348 // seqname
GTTGCTTCTGGCGTGGGTGGGGGGG // seq
+EAS54_6_R1_2_1_443_348 // seqname #2
;;;;;;;;;;;9;7;;.7;393333 // qual
其格式:
<fastq> := <block>+
<block> := @<seqname>\n<seq>\n+[<seqname>]\n<qual>\n
<seqname> := [A-Za-z0-9_.:-]+
<seq> := [A-Za-z\n\.~]+
<qual> := [!-~\n]+
问题是我无法检测到块的结尾(或下一个块的开始),因为 @
也在 <qual>
块中使用。但是 <qual>
块必须与 <seq>
块大小相同。
问题:是否可以编写一个组大小限制为另一个组大小的正则表达式?
喜欢这个(\2.size令牌除外):
(?:@([A-Za-z0-9_\.:-]+)\n([A-Za-z\n\.~]+)\n\+([A-Za-z0-9_.:-]*)\n([!-~\n]{.size}))*
^.....seqname.....^ ^.....seq......^ ^....seqname2....^ ^qual(should be same size as seq)^
更新:我们无法搜索 @
代币,因为它可以出现在 <qual>
区块
这是解析它的正则表达式:
(.*?(?=\n@[A-Z]|$)) //single-line,global
通过 (?=\n@[A-Z]|$)
前瞻,我们强制 .*?
获取所有内容直到 就在 以 '@' 开头的新行之前后跟一个(大写)字母,或输入结束
遗憾的是,无法将 a{n}b{n} 与正则表达式匹配。它需要上下文无关的语法; here's a proof.
(相反,只需匹配 name、seq 和 +,然后获取 seq 匹配的 match.size()
,然后从剩余字符串中读取接下来的 n 个字符以获得 qual。)