我遇到过很多类似的问题。但是,提供的答案似乎对我没有帮助。
我试图对8000篇媒体文章进行主题建模分析。但是我收到了这个错误:
Traceback (most recent call last):
File "extract.py", line 23, in <module>
if re.compile('^(.*?) - \d{2} [a-zA-Z]{3}. \d{4}$').match(lines[1]):
IndexError: list index out of range
第23行所指的是:
if re.compile('^(.*?) - \d{2} [a-zA-Z]{3}. \d{4}$').match(lines[1]):
media = lines[1].split(' - ')[0].replace('*', '')
article = article.replace('\n' + lines[1], '')
if article.find(media) > -1:
containsMediaName.write(filename + '\n')
有人能帮助我以某种方式忽略这个错误吗?
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import re
import string
import textract
import unicodedata
from unidecode import unidecode
if not os.path.isdir('./raw'):
os.mkdir('./raw')
names = open('./deleted-names.txt', 'w')
containsMediaName = open('./contains-media-name.txt', 'w')
for filename in os.listdir('./data'):
article = unidecode(textract.process('./data/' + filename).decode('utf-8'))
article = re.sub('<<', '', article)
article = re.sub('>>', '', article)
lines = article.split('\n')
if re.compile('^(.*?) - \d{2} [a-zA-Z]{3}. \d{4}$').match(lines[1]):
media = lines[1].split(' - ')[0].replace('*', '')
article = article.replace('\n' + lines[1], '')
if article.find(media) > -1:
containsMediaName.write(filename + '\n')
if re.match('^Pagina \d{1,5}$', lines[2]):
article = article.replace('\n' + lines[2], '')
article = re.sub('\nCopyright(.*?)Alle rechten voorbehouden\n', '\n', article)
article = re.sub('\n\(Foto:(.*?)\)\n', '\n', article)
article = re.sub('\n\(Fotograaf:(.*?)\)\n', '\n', article)
article = article.strip().rstrip(' \t\r\n\0')
lines = article.split('\n')
name = lines.pop()
if len(name.split(' ')) <= 3:
article = re.sub('\n' + name, '', article)
names.write(name + ',' + filename + '\n')
initials = '('
for namePart in name.split(' '):
initials += namePart[0]
initials += ')'
article = article.strip()
if(article.endswith(initials)):
article = re.sub(re.escape(initials), '', article)
article = article.strip().rstrip(' \t\r\n\0')
f = open('./raw/' + filename + '.txt', 'w')
f.write(article)
f.close()
names.close()
containsMediaName.close()
答案 0 :(得分:0)
失败的行正在尝试对其中的某些文本执行匹配。
那里的正则表达式代码寻找匹配(可能)符合以下测试模式的文本:
something - 10 marc 1974
something else - 11 apri 2001
another match - 99 xxxx 2004
这些看起来有点像文章标题的格式?其余代码似乎试图从日期中删除文章名称。
有趣的是,(我猜)是一个日期匹配的正则表达式代码似乎与3个字符的月份标识符匹配,加上一个加法字符[a-zA-Z]{3}.
这似乎是一个非常类型的日期格式 - 您的数据适合这种模式?
如果是这样,那么很好,但如果没有,你可能想要在卷曲括号{3}
后删除全站,然后编辑正则表达式:
'^(.*?) - \d{2} [a-zA-Z]{3} \d{4}$'
假设您的日期采用更传统的dd Mon yyyy
格式。
正如其他人所说,您可能还想探索更优雅的异常处理,以涵盖代码未找到日期匹配的情况,或者行对象包含少于2个元素的情况。
这可能是谷歌搜索"exception handling in python"。
但是,为了让你起步和运行,像
这样简单try:
if re.compile('^(.*?) - \d{2} [a-zA-Z]{3}. \d{4}$').match(lines[1]):
media = lines[1].split(' - ')[0].replace('*', '')
article = article.replace('\n' + lines[1], '')
if article.find(media) > -1:
containsMediaName.write(filename + '\n')
except:
print ( "The length of the lines object is {ln}".format(ln=len(lines)) )
如果您在索引1(即第二个元素)处拉取元素的尝试不存在,那将报告行对象的长度 - 这是错误消息建议的问题。
[edit]看到你的代码,看起来split函数找不到你要提供的任何数据的任何换行符,这在尝试从行中获取第1个元素时产生错误。我还注意到你正在阅读德语(?)所以我对正则表达式重新格式化的评论可能不相关。