IndexError:列表索引超出范围,即使请求的索引在

时间:2016-07-17 09:51:14

标签: regex python-2.7

这是我跑的代码

fname = raw_input('Enter file name: ')
if ( len(fname) < 1 ) : fname = 'shi.txt'
fh = open(fname)

for line in fh:
    email=re.findall('^From (.*)',line)
    print len(email)
    print email[0]

    x=email[0]

这是我得到的输出和错误

Enter file name: shi.txt
1
stephen.marquard@uct.ac.za Sat Jan  5 09:14:16 2008
0

Traceback (most recent call last):
File "C:\Users\Shivam\Desktop\test1.py", line 21, in <module>
print email[0]
IndexError: list index out of range

我的问题是,在输出中你可以看到电子邮件[0]不应该超出索引但我仍然会在实际打印电子邮件[0]后收到此错误。此外我我不明白为什么在打印电子邮件[0]后我得到这个0输出。我的代码之后没有执行。这是一个sqlite访问代码的片段。提前谢谢

1 个答案:

答案 0 :(得分:0)

您的代码包含一个for循环,遍历文件中的所有行。

第一行以&#34; From&#34;开头因此满足^From (.*)正则表达式,因此第一行解析结果为Count = 1并且打印捕获的组值(re.findall仅在模式中定义捕获组时返回捕获的值)。 / p>

第二行无法与正则表达式匹配,因此re.findall结果列表为空。因此,您会收到错误。

要解决该问题并检查所有行,只需确保在访问列表中的第一项之前检查长度:

for line in fh:
    email=re.findall('^From (.*)',line)
    if len(email) > 0:
        print email[0]

请注意,此处使用re.findall没有意义,因为匹配始终是单一的。您可以使用re.search,检查是否匹配,并打印匹配内容:

for line in fh:
    email=re.search(r'^From (.*)', line) # get the match object
    if email:                            # if the match is not none
        print email.group(0)             # print Group 0 (match value)