2016-10-11 3 views
1

Хотя я бы просто обновил начало этого вопроса для людей, которые сталкиваются с ним в будущем. Regex не было оптимальным решением для моей конкретной проблемы, но попытка регулярного выражения сложных и разделенных шаблонов (моя логика с самого начала) за один раз не была идеальной. Ответ на поставленный вопрос должен состоять в том, чтобы попробовать отдельные регулярные выражения, которые я думаю, и «отфильтровать» необходимый материал. Мой файл может быть обработан с помощью решения pandas.read_fwf() для получения оптимальных результатов, поэтому я выбрал это как полный ответ.python regex отдельные элементы строки

Я уверен, что это было задано где-то раньше, но я не могу найти вопрос, который точно пытается сделать то, что я хочу, - поэтому приношу свои извинения заранее.

TLDR Как вы можете использовать регулярное выражение для нескольких разных шаблонов в строке, которые не расположены рядом друг с другом или правильно разделены? Неужели я ошибаюсь, пытаясь сделать это за один шаг?

У меня есть несколько строк в довольно подробном файле (см. Конец сообщения), который я хочу вытащить. Я хочу, чтобы несколько бит информации из разных столбцов внутри строки (хотя они не были правильно разделены).

Я знаю, что могу получить это в match.group(), который будет идеальным (потому что я намерен использовать каждый элемент, который я вытаскиваю позже в изоляции), за исключением того, что не могу понять, как сопоставить несколько подстрок, физически отделенных от других другой в строке (если только попытка сделать это - это один шаг, это просто неправильно?).

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

#!/usr/bin/python 

import re 
hhresult_file = sys.argv[1] # The above file 

regex = re.compile(r'\s*\d{1,2}\s\w{4}_\w\s.*') # Will match the whole line (my first shot at the problem) 

def main(): 
    with open(hhresult_file, 'r') as result_fasta: 
     lines = result_fasta.readlines() 
     for line in lines: 
      match = re.search(regex,line) 
      if match: 
       print(match.group()) 

if __name__ == '__main__' : 
    main() 

Но я также пытаюсь вытащить столбцы, которые читают «Хит» «вероятностным» «E-Value «Значение P».

Я думаю, что я могу синтезировать требуемые регулярные выражения для каждого отдельного поля (есть некоторые нюансы, такие как переключатель между экспоненциальными значениями SI и поплавками, например).

Что я не знаю, как это сделать, это «игнорировать» области строки? В частности, я не могу получить «Hit» (= 3izo_F), а затем поле «Prob» из-за описания ударов в промежуточном пространстве.

Я пытался идти об этом с сгруппированными регулярными выражениями, но, не будучи физически смежным он не работает (что-то вроде этого, хотя может быть ошибки в них):

regex = re.compile(r''' 
        (\w{4}_\w) # Match the hit 
        (\d{1,3}\.\d') # Match the probability score 
        (\d\.?\d?|\d\.?\d?E-\d\d|\d\.\d*) # E value as float/E- 
        (\d\.?\d?|\d\.?\d?E-\d\d|\d\.\d*) # Match SI or float P value 
        (\d+\.\d+) # Match the score 
       ''',re.VERBOSE) 

Файл в вопросе :

Query   PAU_03380 PAU_03380 hypothetical protein 3919442:3920968 reverse MW:51681 
Match_columns 508 
No_of_seqs 1 out of 1 
Neff   1.0 
Searched_HMMs 37488 
Date   Mon May 23 20:23:54 2016 
Command  hhsearch -cpu 10 -i /home/wms_joe/PVCs/PVC_operons/prot_all/PAU_03380.faa -d /home/wms_joe/Applications/HHSuite/databases/pdb70/pdb70_hhm.ffdata -B 5 -Z 5 -E 1E-03 -nocons -nopred -nodssp 

No Hit        Prob E-value P-value Score SS Cols Query HMM Template HMM 
    1 3izo_F Fiber; pentameric pento 98.1 2.7E-09 7.3E-14 107.6 0.0 65 93-160 104-168 (581) 
    2 3izo_F Fiber; pentameric pento 97.6 1.3E-07 3.4E-12 95.6 0.0 156 156-317 210-388 (581) 
    3 1ocy_A Bacteriophage T4 short 97.6 1.8E-07 4.7E-12 80.4 0.0 85 323-418 10-122 (198) 
    4 1v1h_A Fibritin, fiber protein 96.1 0.00011 3E-09 60.4 0.0 30 167-198  2-31 (103) 
    5 1v1h_A Fibritin, fiber protein 95.9 0.00019 5.1E-09 59.1 0.0 10 168-177 41-50 (103) 
    6 1pdi_A Short tail fiber protei 95.6 0.00041 1.1E-08 63.3 0.0 26 323-348 90-116 (278) 
    7 2xgf_A Long tail fiber protein 94.1 0.005 1.3E-07 55.1 0.0 31 318-348 22-52 (242) 
    8 1h6w_A Bacteriophage T4 short 84.7 0.25 6.7E-06 47.1 0.0 27 323-349 255-282 (312) 
    9 1qiu_A Adenovirus fibre; fibre 79.9 0.54 1.4E-05 44.4 0.0 24 92-115  7-30 (264) 
10 3s6x_A Outer capsid protein si 72.0  1.3 3.4E-05 43.6 0.0 69 106-191 44-112 (325) 

No 1 
>3izo_F Fiber; pentameric penton base, trimeri viral protein; 3.60A {Human adenovirus 5} 
Probab=98.13 E-value=2.7e-09 Score=107.58 Aligned_cols=65 Identities=22% Similarity=0.362 Sum_probs=42.7 

Q PAU_03380  93 PLILKDDVLSVDLGSGLTNETNGICVGQGDGITVNTSNVAVKQGNGISVTSSGGVAVKVSANKGLSVD 160 (508) 
        ||-+.++-|.++....|+...+++.+--+++++|+.....++....++++ .+++++++. .||.++ 
T 3izo_F   104 PLTVTSEALTVAAAAPLMVAGNTLTMQSQAPLTVHDSKLSIATQGPLTVS-EGKLALQTS--GPLTTT 168 (581) 
Confidence   55555556666666667777777777777777777776777777777764 566666554 355554 


No 2 
>3izo_F Fiber; pentameric penton base, trimeri viral protein; 3.60A {Human adenovirus 5} 
Probab=97.60 E-value=1.3e-07 Score=95.57 Aligned_cols=156 Identities=19% Similarity=0.323 Sum_probs=85.6 

Q PAU_03380  156 GLSVDSSGVAVKVNTDKGISVDGNGVAVKVNTSKGISVDNTGVAVIANASKGISVDGSGV--------------AVIANT 221 (508) 
        .|.+..++-.+.+++..|+.|.++.+.+|+ ..++.+++.|- +-.+...|+.++...-    .+..+. 
T 3izo_F   210 PLHVTDDLNTLTVATGPGVTINNTSLQTKV--TGALGFDSQGN-MQLNVAGGLRIDSQNRRLILDVSYPFDAQNQLNLRL 286 (581) 
Confidence   344544434556666667777666655443 23333333221 1111222333332211    234445 

Это немного, но это всего лишь два вышеупомянутых 2 выравнивания.

UPDATE 1

Просто привести пример того, что я бы идеально, как в конце:

Учитывая линию в 'коротком столе':

1 3izo_F Fiber; pentameric pento 98.1 2.7E-09 7.3E-14 107.6 0.0 65 93-160 104-168 (581) 

I 'd хотел бы получить либо разделительную строку, либо отдельный match.group для:

PDB Hit ID == 3izo_F

Каждый из первых 4-х показателей (как отдельные группы, в идеале, но я мог бы справиться с этим после факта) = 98.12.7E-097.3E-14107.6

такой позор эта программа не только обеспечить надлежащий выход табличный :(

+1

С чем-то этот комплекс, вы вероятно, лучше использовать несколько проходов. Возможно, вы захотите изучить панды как более общее решение. Тип dataframes в пандах очень полезен при работе с таблицами данных, подобными этому. Http: //pandas.pydata.org/ – pizoelectric

+0

В какой части файла вы пытаетесь разобрать? Короткая таблица, где удар может быть усечен или расширенная часть? –

+0

Я не думаю, что вы назвали бы это «типичными» табличными данными (так как это не надежно ограничено) - могут ли панды тоже это обработать? @ C8H10N4O2 - Я не думаю, что у меня есть выбор, кроме как обрабатывать его с помощью регулярных выражений, потому что это не стандартный табличный формат, как я говорю - и, как вы можете видеть, файл имеет контент до и после в разных форматах, что я игнорирую , –

ответ

1

можно использовать pandas.read_fwf прочитать часть табличный, а потому, что ваши заголовки таблицы являются уродливы (т.е. иногда пространство является частью имени переменной, как в Query HMM, а иногда она разделяет имена переменных, как в SS и Cols), вам нужно будет указать ширину столбцов.

Мне нравится использовать строку шаблона для этого.

from io import StringIO 

yourTemplate= \ 
""" 
---|-------------------------------|----|-------|-------|------|-----|----|---------|--------------| 
No Hit        Prob E-value P-value Score SS Cols Query HMM Template HMM 
    1 3izo_F Fiber; pentameric pento 98.1 2.7E-09 7.3E-14 107.6 0.0 65 93-160 104-168 (581) 
    2 3izo_F Fiber; pentameric pento 97.6 1.3E-07 3.4E-12 95.6 0.0 156 156-317 210-388 (581) 
""" 
yourPattern = StringIO(yourTemplate).readlines()[1] 

colBreaks = [i for i, ch in enumerate(yourPattern) if ch == '|'] 

yourWidths = [j-i for i, j in zip(([0]+colBreaks)[:-1], colBreaks) ] 

Тогда мы сможем вернуться к вашему файлу.

yourText= \ 
"""Neff   1.0 
Searched_HMMs 37488 
Date   Mon May 23 20:23:54 2016 
Command  hhsearch -cpu 10 -i /home/wms_joe/PVCs/PVC_operons/prot_all/PAU_03380.faa -d /home/wms_joe/Applications/HHSuite/databases/pdb70/pdb70_hhm.ffdata -B 5 -Z 5 -E 1E-03 -nocons -nopred -nodssp 

No Hit        Prob E-value P-value Score SS Cols Query HMM Template HMM 
    1 3izo_F Fiber; pentameric pento 98.1 2.7E-09 7.3E-14 107.6 0.0 65 93-160 104-168 (581) 
    2 3izo_F Fiber; pentameric pento 97.6 1.3E-07 3.4E-12 95.6 0.0 156 156-317 210-388 (581) 
    3 1ocy_A Bacteriophage T4 short 97.6 1.8E-07 4.7E-12 80.4 0.0 85 323-418 10-122 (198) 
    4 1v1h_A Fibritin, fiber protein 96.1 0.00011 3E-09 60.4 0.0 30 167-198  2-31 (103) 
    5 1v1h_A Fibritin, fiber protein 95.9 0.00019 5.1E-09 59.1 0.0 10 168-177 41-50 (103) 
    6 1pdi_A Short tail fiber protei 95.6 0.00041 1.1E-08 63.3 0.0 26 323-348 90-116 (278) 
    7 2xgf_A Long tail fiber protein 94.1 0.005 1.3E-07 55.1 0.0 31 318-348 22-52 (242) 
    8 1h6w_A Bacteriophage T4 short 84.7 0.25 6.7E-06 47.1 0.0 27 323-349 255-282 (312) 
    9 1qiu_A Adenovirus fibre; fibre 79.9 0.54 1.4E-05 44.4 0.0 24 92-115  7-30 (264) 
10 3s6x_A Outer capsid protein si 72.0  1.3 3.4E-05 43.6 0.0 69 106-191 44-112 (325) 

No 1 
>3izo_F Fiber; pentameric penton base, trimeri viral protein; 3.60A {Human adenovirus 5} 
Probab=98.13 E-value=2.7e-09 Score=107.58 Aligned_cols=65 Identities=22% Similarity=0.362 Sum_probs=42.7 

Q PAU_03380  93 PLILKDDVLSVDLGSGLTNETNGICVGQGDGITVNTSNVAVKQGNGISVTSSGGVAVKVSANKGLSVD 160 (508) 
        ||-+.++-|.++....|+...+++.+--+++++|+.....++....++++ .+++++++. .||.++ 
T 3izo_F   104 PLTVTSEALTVAAAAPLMVAGNTLTMQSQAPLTVHDSKLSIATQGPLTVS-EGKLALQTS--GPLTTT 168 (581) 
Confidence   55555556666666667777777777777777777776777777777764 566666554 355554 


No 2 
>3izo_F Fiber; pentameric penton base, trimeri viral protein; 3.60A {Human adenovirus 5} 
Probab=97.60 E-value=1.3e-07 Score=95.57 Aligned_cols=156 Identities=19% Similarity=0.323 Sum_probs=85.6 

Q PAU_03380  156 GLSVDSSGVAVKVNTDKGISVDGNGVAVKVNTSKGISVDNTGVAVIANASKGISVDGSGV--------------AVIANT 221 (508) 
        .|.+..++-.+.+++..|+.|.++.+.+|+ ..++.+++.|- +-.+...|+.++...-    .+..+. 
T 3izo_F   210 PLHVTDDLNTLTVATGPGVTINNTSLQTKV--TGALGFDSQGN-MQLNVAGGLRIDSQNRRLILDVSYPFDAQNQLNLRL 286 (581) 
Confidence   344544434556666667777666655443 23333333221 1111222333332211    234445 
""" 

Мы отмечаем, что, чтобы добраться до табличной части (начиная с заголовка) необходимо пропустить 5 строк, а затем сохранить 10 строк.

import pandas as pd 
yourData = pd.read_fwf(StringIO(yourText), skiprows=5, nrows=10, header=0, widths = yourWidths) 
print(yourData.dtypes) 
print(yourData) 

Это должно дать вам то, что вы хотите, в табличной форме:

print(yourData.dtypes) 
print(yourData) 

No    int64 
Hit    object 
Prob   float64 
E-value   float64 
P-value   float64 
Score   float64 
SS    float64 
Cols    int64 
Query HMM  object 
Template HMM  object 
dtype: object 
    No        Hit Prob  E-value  P-value \ 
0 1 3izo_F Fiber; pentameric pento 98.1 2.700000e-09 7.300000e-14 
1 2 3izo_F Fiber; pentameric pento 97.6 1.300000e-07 3.400000e-12 
2 3 1ocy_A Bacteriophage T4 short 97.6 1.800000e-07 4.700000e-12 
3 4 1v1h_A Fibritin, fiber protein 96.1 1.100000e-04 3.000000e-09 
4 5 1v1h_A Fibritin, fiber protein 95.9 1.900000e-04 5.100000e-09 
5 6 1pdi_A Short tail fiber protei 95.6 4.100000e-04 1.100000e-08 
6 7 2xgf_A Long tail fiber protein 94.1 5.000000e-03 1.300000e-07 
7 8 1h6w_A Bacteriophage T4 short 84.7 2.500000e-01 6.700000e-06 
8 9 1qiu_A Adenovirus fibre; fibre 79.9 5.400000e-01 1.400000e-05 
9 10 3s6x_A Outer capsid protein si 72.0 1.300000e+00 3.400000e-05 

    Score SS Cols Query HMM Template HMM 
0 107.6 0.0 65 93-160 104-168 (581) 
1 95.6 0.0 156 156-317 210-388 (581) 
2 80.4 0.0 85 323-418 10-122 (198) 
3 60.4 0.0 30 167-198 2-31 (103) 
4 59.1 0.0 10 168-177 41-50 (103) 
5 63.3 0.0 26 323-348 90-116 (278) 
6 55.1 0.0 31 318-348 22-52 (242) 
7 47.1 0.0 27 323-349 255-282 (312) 
8 44.4 0.0 24 92-115 7-30 (264) 
9 43.6 0.0 69 106-191 44-112 (325) 

pandas синтаксис для доступа к этим значениям достаточно прост, как и в yourData.loc[3,'Prob']

+0

Возможно, я пытаюсь сделать это, пока еще не полностью проснулся, и это, вероятно, действительно очевидно, но я получаю жалобы StringIO на то, что шаблон не является unicode. Что мне нужно сделать для строки шаблона, чтобы заставить его заткнуться: P? Я знаю, что 'u' может быть передан' StringIO (u'somestring ') ', как в этой ссылке: http://stackoverflow.com/questions/22316333/how-can-i-resolve-typeerror-with-stringio- in-python-2-7 .... Но я перехожу в переменную, поэтому я не могу заключить ее в кавычки –

+0

ah nevermind ... Я проснулся немного больше и понял, что просто нужно добавить 'u' перед первой '' строки шаблона –

1

У вас есть две части в файле данных. Один из них представляет собой компактную таблицу:

1 3izo_F Fiber; pentameric pento 98.1 2.7E-09 7.3E-14 107.6 0.0 65 93-160 104-168 (581) 
    2 3izo_F Fiber; pentameric pento 97.6 1.3E-07 3.4E-12 95.6 0.0 156 156-317 210-388 (581) 
    3 1ocy_A Bacteriophage T4 short 97.6 1.8E-07 4.7E-12 80.4 0.0 85 

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

line[4:34] for hit 
line[36:40] for prob 

Но эта таблица обрезала поле попадания. Если вам нужен полный контент, вам нужно проанализировать вторую часть файла. И многострочные регулярные выражения - хороший выбор для этого. Это находит хит, вероятность и значение E, заполнять бесплатно, чтобы расширить его.

re.compile(r"No \d*\n>([^\n]*)\nProbab=([\d\.e\-]*).*E-value=([\d\.e\-]*).*", re.MULTILINE) 

Но эта часть файла не содержит значения P. Поэтому кажется, что вам придется объединить эти методы.

+0

Я в порядке, чтобы игнорировать часть «обрезанного хита» части компактного стола. Также прекрасно игнорировать все за пределами этой таблицы. Я обновил вопрос, чтобы включить пример результата, который я пытаюсь достичь. –

Смежные вопросы