Хотя я бы просто обновил начало этого вопроса для людей, которые сталкиваются с ним в будущем. 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.1
2.7E-09
7.3E-14
107.6
такой позор эта программа не только обеспечить надлежащий выход табличный :(
С чем-то этот комплекс, вы вероятно, лучше использовать несколько проходов. Возможно, вы захотите изучить панды как более общее решение. Тип dataframes в пандах очень полезен при работе с таблицами данных, подобными этому. Http: //pandas.pydata.org/ – pizoelectric
В какой части файла вы пытаетесь разобрать? Короткая таблица, где удар может быть усечен или расширенная часть? –
Я не думаю, что вы назвали бы это «типичными» табличными данными (так как это не надежно ограничено) - могут ли панды тоже это обработать? @ C8H10N4O2 - Я не думаю, что у меня есть выбор, кроме как обрабатывать его с помощью регулярных выражений, потому что это не стандартный табличный формат, как я говорю - и, как вы можете видеть, файл имеет контент до и после в разных форматах, что я игнорирую , –