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

#python

#python

Вопрос:

У меня есть документ со следующим форматированием;

     QUERY: STBZIP38
     Length of Query Sequence:       2000 bp     | Nucleotide Frequencies:  A -  0.34   G -  0.16   T -  0.35   C -  0.15
    
    
     TFBS AC: RSP00073//OS: tobacco (Nicotiana tabacum) /GENE: synthetic oligonucleotides/TFBS: PA /BF: TAF-1
     Motifs on " " Strand: Mean Exp. Number   0.00391     Up.Conf.Int.  1     Found   1
         421  tCCACGTGGC      430 (Mism.= 1)
    
     Motifs on "-" Strand: Mean Exp. Number   0.00391     Up.Conf.Int.  1     Found   1
         430  GCCACGTGGa      421 (Mism.= 1)
    
     TFBS AC: RSP00153//OS: Parsley, Petroselinum crispum /GENE: CHS/TFBS: Box II /BF: CPRF-1; CPRF-2; CPRF-3;
     Motifs on " " Strand: Mean Exp. Number   0.00358     Up.Conf.Int.  1     Found   1
         422  CCACGTGGCa      431 (Mism.= 1)
    
     TFBS AC: RSP00154//OS: parsley (Petroselinum crispum) /GENE: CHS/TFBS: ACE (CHS) /BF: bZIP factors CPRF1, CPRF4
     Motifs on " " Strand: Mean Exp. Number   0.00358     Up.Conf.Int.  1     Found   1
         422  CCACGTGGCa      431 (Mism.= 1)
Totally      50 motifs of    43 different TFBSs have been found
____________________________________________________________

 QUERY: STBZIP17
 Length of Query Sequence:       2000 bp     | Nucleotide Frequencies:  A -  0.37   G -  0.13   T -  0.39   C -  0.11


 TFBS AC: RSP00577//OS: tomato (Lycopersicon esculentum), Lycopersicon esculentum /GENE: rbcS3A/TFBS: AT-rich FF2 /BF: unknown nuclear factor
 Motifs on "-" Strand: Mean Exp. Number   0.00187     Up.Conf.Int.  1     Found   1
     206  AATAATTAaAcATTAATTAA      187 (Mism.= 2)

 TFBS AC: RSP00797//OS: potato (Solanum tuberosum) /GENE: patatin 21/TFBS: SURE-1 /BF: SURF
 Motifs on "-" Strand: Mean Exp. Number   0.00440     Up.Conf.Int.  1     Found   1
    1027  TAAAGAATAaAAAAAaaAA     1009 (Mism.= 3)

 TFBS AC: RSP00864//OS: arabidopsis (Arabidopsis thaliana) /GENE: STK/TFBS: GA-5 /BF: BPC1
 Motifs on "-" Strand: Mean Exp. Number   0.00260     Up.Conf.Int.  1     Found   1
    1966  AGAGAGAGA     1958 (Mism.= 0)
  

Результат, который я хочу, выглядит следующим образом;

 STBZIP38    RSP00073//OS
STBZIP38    RSP00153//OS
STBZIP38    RSP00154//OS
STBZIP17    RSP00577//OS
STBZIP17    RSP00797//OS
STBZIP17    RSP00864//OS
  

Я просматривал пару руководств и пытался использовать функцию разделения (я все еще изучаю A, B, C python). Я начал со следующего, что я все еще пытаюсь выяснить, — это как захватить только слово после термина, который я использую (например, ЗАПРОС: тогда берите только STBZIP38, затем число после TFBC AC:),.
Я очень признателен, если кто-нибудь сможет мне помочь в этом отношении. Заранее спасибо.

 with open ('Softberry.txt') as fo:
for rec in fo:
    print((rec.split('QUERY:'))   ','  (rec.split('TFBS AC:')))
  

Комментарии:

1. Я настоятельно рекомендую вам изучить модуль python re . Доклад Эла Свейгарта на PyCon 2017 о регулярных выражениях в python — очень хорошее начало .

2. Конечно, я так и сделаю. Спасибо!

Ответ №1:

Отличный шаблон для начала, я подготовил точные шаблоны регулярных выражений, сделайте все остальное. PS: что вам нужно, так это метод readlines() регулярное выражение, без разделения!

 import re

s = """QUERY: STBZIP38
     Length of Query Sequence:       2000 bp     | Nucleotide Frequencies:  A -  0.34   G -  0.16   T -  0.35   C -  0.15
    
    
     TFBS AC: RSP00073//OS: tobacco (Nicotiana tabacum) /GENE: synthetic oligonucleotides/TFBS: PA /BF: TAF-1
     Motifs on " " Strand: Mean Exp. Number   0.00391     Up.Conf.Int.  1     Found   1
         421  tCCACGTGGC      430 (Mism.= 1)
    
     Motifs on "-" Strand: Mean Exp. Number   0.00391     Up.Conf.Int.  1     Found   1
         430  GCCACGTGGa      421 (Mism.= 1)
    
     TFBS AC: RSP00153//OS: Parsley, Petroselinum crispum /GENE: CHS/TFBS: Box II /BF: CPRF-1; CPRF-2; CPRF-3;
     Motifs on " " Strand: Mean Exp. Number   0.00358     Up.Conf.Int.  1     Found   1
         422  CCACGTGGCa      431 (Mism.= 1)
    
     TFBS AC: RSP00154//OS: parsley (Petroselinum crispum) /GENE: CHS/TFBS: ACE (CHS) /BF: bZIP factors CPRF1, CPRF4
     Motifs on " " Strand: Mean Exp. Number   0.00358     Up.Conf.Int.  1     Found   1
         422  CCACGTGGCa      431 (Mism.= 1)
Totally      50 motifs of    43 different TFBSs have been found
 QUERY: STBZIP17
 Length of Query Sequence:       2000 bp     | Nucleotide Frequencies:  A -  0.37   G -  0.13   T -  0.39   C -  0.11


 TFBS AC: RSP00577//OS: tomato (Lycopersicon esculentum), Lycopersicon esculentum /GENE: rbcS3A/TFBS: AT-rich FF2 /BF: unknown nuclear factor
 Motifs on "-" Strand: Mean Exp. Number   0.00187     Up.Conf.Int.  1     Found   1
     206  AATAATTAaAcATTAATTAA      187 (Mism.= 2)

 TFBS AC: RSP00797//OS: potato (Solanum tuberosum) /GENE: patatin 21/TFBS: SURE-1 /BF: SURF
 Motifs on "-" Strand: Mean Exp. Number   0.00440     Up.Conf.Int.  1     Found   1
    1027  TAAAGAATAaAAAAAaaAA     1009 (Mism.= 3)

 TFBS AC: RSP00864//OS: arabidopsis (Arabidopsis thaliana) /GENE: STK/TFBS: GA-5 /BF: BPC1
 Motifs on "-" Strand: Mean Exp. Number   0.00260     Up.Conf.Int.  1     Found   1
    1966  AGAGAGAGA     1958 (Mism.= 0)"""
         
pat1='STB.*d*'

pat2 = 'RSP.*OS'

m = re.findall(pat1,s)

n = re.findall(pat2, s)

#print(m, n)

print(m[0],  n[0])
print(m[0],  n[1])
print(m[0],  n[2])
print(m[1], n[3]) 
print(m[1],  n[4])
print(m[1],  n[5])
  

вывод

 STBZIP38 RSP00073//OS
STBZIP38 RSP00153//OS
STBZIP38 RSP00154//OS
STBZIP17 RSP00577//OS
STBZIP17 RSP00797//OS
STBZIP17 RSP00864//OS


    
  

Комментарии:

1. Спасибо 🙂 . Раньше ненавидел кодирование (программирование в целом), но теперь сожалею об этой ошибке! быстрый вопрос; следующая часть — у меня почти 100 страниц (скопирована только половина входных данных). Каков наилучший способ сжать эту часть? ~~~ #print(m, n) print(m[0], n[0]) print(m[0], n[1]) print(m[0], n[2]) print(m[1], n[3]) print(m[1], n[4]) print(m[1], n[5]) ~~~

2. пожалуйста, найдите документ здесь: drive.google.com/file/d/16R__MlqfvKhF5cq5thi8FNZaouJi9K5u/… Спасибо!

3. Я пробовал много способов, но манипулировать им гораздо сложнее, чем я думал.. Хорошая новость в том, что я нашел очень простой способ выполнить эту работу 😁 с помощью регулярных выражений в notepad . Но я устал сейчас и собираюсь сделать это 2morrow. увидимся.

4. в основном вам придется делать это вручную, но это самое простое решение, которое я нашел, загрузите notepadd и используйте шаблон регулярных выражений, используемый для поиска совпадающих выражений, а затем вручную выровняйте их. В противном случае продвинутый программист может предложить вам подход к программированию. С уважением.

Ответ №2:

Хорошо, ребята. Вот как это закончилось. Большое спасибо за помощь, оказанную CYREX и xelf (Reddit).

 with open('Softberry.txt') as f:
    for line in f:
        if line.startswith(' QUERY:'):
            query = line.split(':', 1)[1].strip()
        if 'AC:' in line:
            ac = line.split('AC:')[1].split(':')[0].strip()
            print(query,ac)