【发布时间】:2016-10-11 17:28:44
【问题描述】:
虽然我只是为将来遇到这个问题的人更新这个问题的开头。正则表达式不是解决我的特定问题的最佳解决方案,但尝试一次对复杂和分离的模式(我的逻辑从一开始)进行正则表达式并不理想。
上述问题的答案是尝试我认为的单独的正则表达式,并“过滤掉”所需的东西。
我的文件可以使用pandas.read_fwf() 解决方案来处理以获得最佳结果,所以我选择它作为完整答案。
我确定以前有人问过这个问题,但我找不到一个完全符合我要求的问题 - 所以我提前道歉。
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-Value”的列。
我认为我可以为每个单独的字段综合所需的正则表达式(例如,有一些细微差别,例如指数 SI 值和浮点数之间的切换)。
我不知道该怎么做是“忽略”字符串的区域?具体来说,由于中间空间中的命中描述,我无法获取“命中”(= 3izo_F)和“概率”字段。
我试图用分组的正则表达式来解决这个问题,但是如果没有物理上的相邻它就不起作用(类似于这些,尽管其中可能存在错误):
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 个对齐方式中的更多。
更新 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)
我想获得一个分隔字符串,或者单独的match.group:
PDB 命中 ID == 3izo_F
前 4 个指标中的每一个(理想情况下作为单独的组,但事后我可以处理)= 98.1 2.7E-09 7.3E-14 107.6
可惜这个程序不只是提供适当的表格输出:(
【问题讨论】:
-
对于这么复杂的东西,使用多遍可能会更好。您可能希望将 pandas 视为更通用的解决方案。在处理这样的数据表时,pandas 中的数据框类型非常有用。 pandas.pydata.org
-
您要解析文件的哪一部分?可以截断或扩展部分的短表?
-
我认为您不会将其称为“典型”表格数据(因为它没有可靠地分隔)-熊猫也可以处理吗? @C8H10N4O2 - 我认为我别无选择,只能通过正则表达式处理它,因为它不是我所说的标准表格格式 - 正如你所看到的,该文件之前和之后的内容都是我忽略的不同格式。
-
@JoeHealey 在其他地方你说你可以忽略非表格数据。所以我建议你看
pandas.read_fwf,尤其是skiprows=和nrows=参数,只看表格部分。 -
啊,我明白了——你的意思是在我删除文件所需的行后结合使用。简单浏览一下,它看起来很可能会做我想做的事情 - 我会进一步调查!