Я понимаю, почему возникает эта ошибка, но думал, что я рассмотрел свои основы в функции.
Эта функция выполняет поиск в структуре папок и выводит совпадающую строку, строку до и строку после... если они существуют. В большинстве случаев это работает, но в некоторых случаях выдает ошибку индекса.
def pattern_search(x,pattern):
fname = x['Search File']
file = os.path.join(DATA,fname)
match = ""
if os.path.exists(file):
match = extract_match(file,pattern)
else:
match = "File NOT FOUND"
return match
def extract_match(file,pattern):
contents = open(file, encoding = "ISO-8859-1").read()
if re.search(pattern, contents):
lines = contents.splitlines()
match = ""
i = 0
for index, line in enumerate(lines):
if i < 1:
if re.search(pattern, line):
i += 1
line = f"MATCH: ({str(index)}) {line}"
if lines[index - 1]:
line = f"PREV: {lines[index - 1]}" + "\n" + line
if lines[index + 1]:
line += "\n" + f"POST: {lines[index + 1]}"
match = line
else:
pass
else:
match = "NF"
#print(match)
return match
Запустите следующим образом:
df["term1"] = df.apply(pattern_search, args=[term1_pat], axis=1)
Для большинства терминов он вернет соответствующую строку с контекстом:
PREV: I like cake
MATCH: This is a cake related matching sentence with cake term: batter
POST: mix 3 cups of regex with butter and add cream cheese.
Я предполагаю, что это с файлами с несколькими строками или, возможно, совпадение происходит и в самом конце или в самом начале. Как я должен учитывать эти условия?
Это происходит из-за строк, в которых вы проверяете, являются ли строки с определенным индексом ложными.
Вам нужно убедиться, что сам индекс выше нуля при уменьшении, или проверить, не равен ли текущий индекс количеству строк при увеличении.
Заменять
if lines[index - 1]:
if lines[index + 1]:
С
if index > 0 and lines[index - 1]:
if index < len(lines) - 1 and lines[index + 1]: