【问题标题】:IndexError: list index out of range, for re.matchIndexError:列表索引超出范围,用于 re.match
【发布时间】:2015-02-16 20:09:07
【问题描述】:

以下是我编写的脚本的一部分,其中的 if 语句有问题。 如果我想使用 re.match('ATOM|MODEL',lines[i]),我会收到错误消息。删除 re.match 中的“|MODEL”,它将起作用。 谁能给我一些提示,为什么会这样?非常感谢!

new_pdb=open(pdb_out,'w')
i=0
while (i<len(lines)):
    frag=lines[i].split()
# do not know why 'ATOM|MODEL' does not work
    if (re.match('ATOM',lines[i]) and "H" not in frag[2]):
        new_pdb.write(lines[i])
    i=i+1
new_pdb.close()

下面是我使用 re.match('ATOM|MODEL',lines[i]) 时的错误信息:

Traceback(最近一次调用最后一次): 文件“non-h-1.py”,第 17 行,在 if (re.match('ATOM|MODEL',lines[i]) and "H" not in frag[2]): IndexError: 列表索引超出范围

【问题讨论】:

    标签: python


    【解决方案1】:

    至少有一个以MODEL 开头的lines 包含少于三个空格分隔的项目,因此frag[2] 失败。如果您从正则表达式中删除 |MODELre.match() 将失败,因此 Python 甚至不会尝试评估 frag[2],这就是在这种情况下不会发生错误的原因。

    除此之外,您不应该使用 while 循环迭代 lines - Python 不是 C。使用

    for line in lines:
        frag = line.split()
        if (re.match('ATOM',line) and "H" not in frag[2]):
            new_pdb.write(line)
    

    【讨论】:

    • 非常感谢。你说的对。现在我重写了 if 语句,试图保留更多的行。它有效:'if (re.match('ATOM',lines[i]) and "H" not in frag[2]) or \re.match('MODEL|TER|ENDMDL',lines[i]) : new_pdb.write(lines[i])'
    • 很抱歉,我无法在 cmets 中按 ctrl+K 格式化代码。它说“代码”,但它似乎不起作用。
    • @ziweiguan:是的,cmets 中的多行代码是不可能的(而且没用)。您可以通过用反引号包围小代码 sn-ps 来格式化它们。另外,请看我回答的第二部分。不要使用计数器变量,除非您出于其他原因需要它们的实际值。
    • 再次感谢蒂姆。我现在用 for 循环替换了 while 循环。输出是一样的。正如你所说,我最好使用 for 循环来完成这项任务。
    猜你喜欢
    • 2011-10-31
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多