这是我跑的代码
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访问代码的片段。提前谢谢
答案 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)