Как извлечь уникальную строку символов из строки текстового файла?

У меня есть большой текстовый файл, строки которого составлены в таком формате:

Query: 1586     cccaagatgagctgcagccccccagagagagctctgcacgtcaccaagtaaccaggcccc 1645
Sbjct: 27455708 cccaagatgagctgcagccccccagagagagctctgcacgtcaccaagtaaccaggcccc 27455649

Query: 1646     agcctccaggcccccaactccgcccagcctctccccgctctggatcctgcactctaacac 1705      
Sbjct: 27455648 agcctccaggcccccaactccgcccagcctctccccgctctggatcctgcactctaacac 27455589

Query: 1706     tcgactctgctgctcatgggaagaacagaattgctcctgcatgcaactaattcaataaaa 1765              
Sbjct: 27455588 tcgactctgctgctcatgggaagaacagaattgctcctgcatgcaactaattcaataaaa 27455529

Для каждой строки я хочу иметь возможность извлекать только различные последовательности agtc, удаляя другой символ (запрос, sbjct и различные числа), чтобы окончательная строка выглядела так

line1 = cccaagatgagctgcagccccccagagagagctctgcacgtcaccaagtaaccaggcccc
line2 = cccaagatgagctgcagccccccagagagagctctgcacgtcaccaagtaaccaggcccc
etc...

Я работаю над этим некоторое время и не могу заставить его работать. Я пробовал модуль re и .translate, но безрезультатно. Я программирую на питоне 3.4. Спасибо!


person Peter    schedule 12.10.2014    source источник
comment
Можно найти различия между двумя строками: stackoverflow.com /вопросы/17904097/   -  person Anderson Green    schedule 12.10.2014
comment
регулярное выражение будет работать, но будет очень медленным по сравнению с split()   -  person John La Rooy    schedule 12.10.2014
comment
Где код, который вы пробовали, и какая проблема у вас возникла с кодом?   -  person jww    schedule 12.10.2014
comment
из вашего вывода кажется, что это простая строковая операция. почему вы попробовали re? что ты пробовал?   -  person salmanwahed    schedule 12.10.2014
comment
могу ли я спросить, что вы пробовали?   -  person Drewdin    schedule 12.10.2014


Ответы (1)


Хотя вы могли бы использовать регулярные выражения (как вы пытались), пример, который вы предоставили, можно легко разделить, используя agtc_part = line.split()[2]

Это разбивает заданную строку на список строк, где разделителем является пробел. Индексация начинается с 0, поэтому часть с agct индексируется на 2.

Обратите внимание, что вызов split() без явной передачи аргумента, указывающего символ для разделения, не только разделяет символ пробела, но также группирует последовательные пробелы вместе, а не разделяет их на каждый. Это важно в вашем случае, потому что у вас есть другое количество пробелов между числом и строкой agct.

Пример:

>>> "aaa   bbb".split()
['aaa', 'bbb']
>>> "aaa   bbb".split(' ')
['aaa', '', '', 'bbb']
person three_pineapples    schedule 12.10.2014
comment
Небольшой момент: разделителем по умолчанию является пробел, поэтому вы можете просто line.split()[2] - person Burhan Khalid; 12.10.2014
comment
Да, я знал об этом, но подумал, что может быть лучше сделать это явно :) - person three_pineapples; 12.10.2014
comment
@three_pineapples: ваше решение дает неправильный результат для строки, начинающейся с Query. При использовании явного пробела (' ') вы попали в ловушку. Из документации: Если указан sep, последовательные разделители не группируются вместе< /а>. - person Matthias; 12.10.2014
comment
@ Матиас О! Когда я написал ответ, приведенный пример не был в блоке кода в сообщении, поэтому между числом и текстом был виден только 1 пробел. Таким образом, я думал, что все было разделено одним пробелом, а не дополнено, чтобы хорошо выглядеть при печати. Я обновлю свой ответ. - person three_pineapples; 12.10.2014
comment
@three_pineapples: Похоже, я тоже проголосовал за вас. :-) - person Matthias; 12.10.2014