Прочтите каждую строку текста и замените ее с помощью регулярного выражения (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]))
Полезный инструмент может принять длину каждой строки для записи. Или, может быть, посмотрите на первые несколько строк, чтобы автоматически определить длину общего префикса.