“。”通配符在python的正则表达式中对我不起作用?

时间:2018-07-04 15:36:45

标签: python regex

所以我想从一段.pdb格式数据中提取以下氨基酸缩写: ['GLU','PHE',...,'ASN']

ATOM    296  OE2 GLU A  43      18.414  12.323   8.758  1.00 32.23           O  
ATOM    297  N   PHE A  50      18.072  10.668  14.644  1.00 34.68           N  
ATOM    298  CA  PHE A  50      18.038  10.228  16.039  1.00 35.61           C  
ATOM    299  C   PHE A  50      18.501  11.321  17.019  1.00 35.86           C  
ATOM    300  O   PHE A  50      18.018  11.413  18.091  1.00 36.21           O  
ATOM    301  CB  PHE A  50      18.844   8.936  16.226  1.00 35.43           C  
ATOM    302  CG  PHE A  50      18.811   8.386  17.623  1.00 37.33           C  
ATOM    303  CD1 PHE A  50      17.924   7.416  17.982  1.00 36.31           C  
ATOM    304  CD2 PHE A  50      19.659   8.840  18.557  1.00 39.84           C  
ATOM    305  CE1 PHE A  50      17.875   6.922  19.220  1.00 37.80           C  
ATOM    306  CE2 PHE A  50      19.591   8.330  19.833  1.00 40.97           C  
ATOM    307  CZ  PHE A  50      18.709   7.368  20.144  1.00 37.91           C  
ATOM    308  N   ASN A  51      19.462  12.125  16.616  1.00 36.20           N ...

然后我在python脚本中使用了以下命令:

residue=re.compile(r"(?<=ATOM...............)+?(?=..............\.)").findall(fpdb)

希望通过查看字符串的前后位置来根据文件格式提取目标字符串。 但是我只得到一个空名单,所以我很困惑,急需一些帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

使用str.split()

例如:

s = """ATOM    296  OE2 GLU A  43      18.414  12.323   8.758  1.00 32.23           O  
ATOM    297  N   PHE A  50      18.072  10.668  14.644  1.00 34.68           N  
ATOM    298  CA  PHE A  50      18.038  10.228  16.039  1.00 35.61           C  
ATOM    299  C   PHE A  50      18.501  11.321  17.019  1.00 35.86           C  
ATOM    300  O   PHE A  50      18.018  11.413  18.091  1.00 36.21           O  
ATOM    301  CB  PHE A  50      18.844   8.936  16.226  1.00 35.43           C  
ATOM    302  CG  PHE A  50      18.811   8.386  17.623  1.00 37.33           C  
ATOM    303  CD1 PHE A  50      17.924   7.416  17.982  1.00 36.31           C  
ATOM    304  CD2 PHE A  50      19.659   8.840  18.557  1.00 39.84           C  
ATOM    305  CE1 PHE A  50      17.875   6.922  19.220  1.00 37.80           C  
ATOM    306  CE2 PHE A  50      19.591   8.330  19.833  1.00 40.97           C  
ATOM    307  CZ  PHE A  50      18.709   7.368  20.144  1.00 37.91           C  
ATOM    308  N   ASN A  51      19.462  12.125  16.616  1.00 36.20           N"""

for i in s.split("\n"):
    print(i.split()[3])

输出:

GLU
PHE
PHE
PHE
PHE
PHE
PHE
PHE
PHE
PHE
PHE
PHE
ASN

使用列表理解。

例如:

data = [i.split()[3] for i in s.split("\n")]
print(data)
#['GLU', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'ASN']

使用正则表达式

import re
print( re.findall(r"ATOM\s+\d+\s+\w+\s+([A-Z]+)", s) )

答案 1 :(得分:0)

假定没有丢失的单元格值,如果要在有12列时提取第3列(从0开始的列),

import re
re.split(r'\s+', fpdb)[3::12]
# ['GLU', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'PHE', 'ASN']