【问题标题】:python regex separated elements of a stringpython 正则表达式分隔字符串的元素
【发布时间】: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=参数,只看表格部分。
  • 啊,我明白了——你的意思是在我删除文件所需的行后结合使用。简单浏览一下,它看起来很可能会做我想做的事情 - 我会进一步调查!

标签: python regex string


【解决方案1】:

可以使用pandas.read_fwf 读取表格部分,但是因为您的表格标题格式错误(即,有时空格是变量名的一部分,如Query HMM,有时它分隔变量名,如在SSCols) 中,您将不得不指定列宽。

我喜欢使用模板行来执行此操作。

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']

【讨论】:

  • 我可能会尝试在尚未完全清醒的情况下执行此操作,这可能很明显,但我收到 StringIO 抱怨模板不是 unicode。我必须对模板字符串做什么才能让它闭嘴:P?我知道u 可以给StringIO(u'somestring'),如下链接所示:stackoverflow.com/questions/22316333/… ....但是我传入了一个变量,所以我不能用引号括起来
  • 啊没关系...我醒了一点,意识到它只需要在模板字符串的第一个'''之前添加u
【解决方案2】:

您的数据文件中有两个部分。一种是紧凑型表:

  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 值。因此,您似乎必须将这些方法结合起来。

【讨论】:

  • 我可以忽略紧凑表的“修剪命中描述”部分。忽略该表之外的所有内容也很好。我已经更新了问题,以包含我想要实现的输出示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
相关资源
最近更新 更多