Прочтите каждую строку текста и замените ее с помощью регулярного выражения (Python)

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

Исходный файл выглядит так:

@C00127:132:CDTL1ACXX:11000(several digits...)
@C00127:132:CDTL1ACXX:55588(several digits...)
@C00127:132:CDTL1ACXX:99999(several digits...)

Моя идея состоит в том, чтобы написать новый файл, содержащий сохраненный образец строк (например, "@C00127:132:CDTL1ACXX:"), за которым следуют первые 5 цифр переменной. Итак, я подумал о таком сценарии:

import re
general_ID = open("general_ID.txt", "w+")
x = raw_input('type the name of the fastq file that you wanna extract the IDs: ')
with open (x, 'rt') as myfile:   
    for line in myfile:
        general_ID.write(re.sub('@C00127:132:CDTL1ACXX:......+', '@C00127:132:CDTL1ACXX:.....', line))
general_ID.close()

Когда я запускаю этот скрипт, мой исходный файл из этого:

@C00127:132:CDTL1ACXX:11000(several digits...)
@C00127:132:CDTL1ACXX:55588(several digits...)
@C00127:132:CDTL1ACXX:99999(several digits...)
etc

Заканчивается так:

C00127:132:CDTL1ACXX:.....
C00127:132:CDTL1ACXX:.....
C00127:132:CDTL1ACXX:.....
etc

2 ответа

Вы можете использовать регулярное выражение, например

@C00127:132:CDTL1ACXX:(\d{5})

См. Демонстрацию регулярных выражений. Детали:

  • @C00127:132:CDTL1ACXX: - буквальный текст
  • (\d{5}) - Группа 1: пять цифр

Код Python:

import re, os
x = input('type the name of the fastq file that you wanna extract the IDs: ')
if os.path.isfile(x):
    with open("general_ID.txt", "w") as general_ID:
        with open (x, 'r') as myfile:   
            for line in myfile:
                m = re.search(r'@C00127:132:CDTL1ACXX:(\d{5})', line)
                if m:
                    general_ID.write( "{}\n".format(m.group(1)) )

Используйте ломтик

Для решения этой проблемы регулярные выражения не нужны. Префикс имеет фиксированную длину; просто возьмите отрезок фиксированной длины каждой строки.

id_len = 5
prefix_len = len("C00127:132:CDTL1ACXX:")
keep_len = prefix_len + id_len

with open("general_ID.txt", "w+") as general_ID:
    x = raw_input('type the name of the fastq file that you wanna extract the IDs: ')

    with open (x, 'rt') as myfile:   
        for line in myfile:
            general_ID.write("{}\n".format(line[:keeplen]))

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

Другие вопросы по тегам