Regex 大小等于上一个块的正则表达式搜索块
我想用正则表达式逐块解析FASTQ文件。 FASTQ文件如下所示:Regex 大小等于上一个块的正则表达式搜索块,regex,fastq,Regex,Fastq,我想用正则表达式逐块解析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
@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]+
更新:我们无法搜索
@
令牌,因为它可能出现在
块中这里有一个正则表达式来解析它:
(.*?(?=\n@[A-Z]|$)) //single-line,global
通过(?=\n@[A-Z]|$)
向前看,我们强制*?
在以“@”开头的新行后面加上(大写)字母或输入结尾之前获取所有内容
不幸的是,不可能将{n}b{n}与正则表达式匹配。它需要上下文无关的语法
(相反,只需匹配name、seq和+,然后获取seq匹配,然后从剩余字符串中读取接下来的n个字符以获得qual。)Regex不太擅长通常属于编程/脚本语言的逻辑。编程语言?@ninjalj POSIX Regex或ECMASsince FASTQ格式正好是每个块四行的顺序,为什么不按顺序一次读四行,准确地知道哪一行是name、seq、+、和qual呢?如果已将所有数据作为字符串,请按“\n”将其拆分为一个数组,然后将项目0-3、4-7、8-11等。。。是name,seq,+,qual块。@webb它不是:)正如您在格式
\n
中看到的那样,在seq
和qual
字段中允许使用符号。如果qual
字段的第一个字符是@
啊,则符号不能正常工作。但是字母不能在qual right中显示,所以请修改“向前看”以查看@+字母?(更新)之间的任何符号
和~
(包括它们本身)+\n
可能出现在qual中,正如它的正则表达式中所提到的:[!-~\n@]+
是否seqname总是23个字符,qual/seq 25?否,[…]+
意味着可以有1到无限个字符。但是qual
length应该与seq
length相同,我正在试图找出正则表达式中有没有任何技巧可以增加这种条件。你们注意到这可能是一个有疑问的短语吗?这不是一个拖拉。一个证明不可能的回答是可以接受的。@LibertyPaul,请接受我对错误指控的道歉。
(.*?(?=\n@[A-Z]|$)) //single-line,global