2016-05-11 2 views
1

Я хочу проанализировать файл FASTQ с блоком регулярных выражений блоком. FASTQ файл выглядит следующим образом:Поисковый блок Regex с размером, равным предыдущему блоку

@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]{\2.size}))* 
    ^.....seqname.....^ ^.....seq......^ ^....seqname2....^ ^qual(should be same size as seq)^ 

UPDATE: Мы не можем искать @ маркеров, потому что он может появиться в <qual> блоке

+1

Regex не очень хорошо в логике который обычно принадлежит к языкам программирования/сценариев. –

+0

Язык программирования? – ninjalj

+0

@ninjalj POSIX regex, или ECMAS – LibertyPaul

ответ

1

, к сожалению, это не представляется возможным, чтобы соответствовать {п} Ь {п} с регулярное выражение. это требует контекстно-свободной грамматики; here's a proof.

(вместо этого, просто сопрягать имя, последовательность и +, а затем получить match.size() матча след, а затем прочитать следующие п символов из оставшейся строки, чтобы получить каче.)

+0

Вы заметили ** Возможно ли это ** фразу, о которой идет речь, не так ли? Это не троллинг. Ответ с доказательством невозможности является приемлемым. – LibertyPaul

+1

@LibertyPaul, пожалуйста, примите мои извинения за ложное обвинение. – webb

0

здесь регулярное выражение для разбора это:

(.*?(?=\[email protected][A-Z]|$)) //single-line,global 

с (?=\[email protected][A-Z]|$) опережающего просмотра, мы заставляем .*?, чтобы захватить все до непосредственно перед новые строки, начинающиеся с «@» с последующим (капитала) письмо или конец ввода

demo

+0

Это не работает должным образом, если первым символом поля' qual' является '@' https : //regex101.com/r/vN3aV0/1 – LibertyPaul

+0

ahh. но буквы не могут отображаться в правильном порядке, поэтому измените вид, чтобы увидеть букву @ +? (обновлено) – sweaver2112

+0

Любые символы между '! 'и' ~ '(включая себя) +' \ n' могут появляться в qual, как указано в его регулярном выражении: '[! - ~ \ n @] +' https://regex101.com/r/yN9oX6/1 – LibertyPaul