Python: извлечение текста и понимание списка

#python #list #list-comprehension #text-extraction

#python #Список #понимание списка #извлечение текста

Вопрос:

Я извлек текст из PDF-файла с помощью pdfplumber. Текст содержит несколько элементов формата ‘Exhibit XY’, где X — буква, а Y — число, например, Exhibit C40 или Exhibit R700.

Я пытаюсь сократить весь извлеченный текст, чтобы просто отобразить различные комбинации Exhibit XY в виде списка. Мои первоначальные мысли состояли в том, чтобы преобразовать текстовую строку в список:

 import pdfplumber

with pdfplumber.open(file) as pdf:

    p1 = pdf.pages[0]
    p2 = pdf.pages[1]
    p3 = pdf.pages[2]
    
    p1_text = p1.extract_text()
    p2_text = p2.extract_text()
    p3_text = p3.extract_text()
    
    # print(p1_text, p2_text, p3_text)
    
    full_text = p1_text   p2_text   p3_text
    
    list_full_text = full_text.split()
  

Вывод из pdfplumber выглядит следующим образом:

 apple cars 2014 pizza hut. Aftermath, you tried an Exhibit R40; decidedly 50 times 
larger than Exhibit C400. The 1,000 luckiest break had the under dome Exhibit R9. 
Exhibit P21 as well. 0.1 you have not found it again. Exhibit CB12 district office see 
Exhibit MM42. 
  

В форме списка это:

 ['apple', 'cars', '2014', 'pizza', 'hut.', 'Aftermath,', 'you', 'tried', 'an', 'Exhibit', 'R40;', 'decidedly', '50', 'times', 'larger', 'than', 'Exhibit', 'C400.', 'The', '1,000', 'luckiest', 'break', 'had', 'the', 'under', 'dome', 'Exhibit', 'R9.', 'Exhibit', 'P21', 'as', 'well.', '0.1', 'you', 'have', 'not', 'found', 'it', 'again.', 'Exhibit', 'CB12', 'district', 'office', 'see', 'Exhibit', 'MM42.']
  

Мне кажется, что какая-то форма понимания списка могла бы сократить список, чтобы дать только комбинации Exhibit XY, например, с чем-то вроде этого:

 print([i for i in list_full_text if [some condition])
  

но я не уверен, какое условие могло бы охватить все ‘Exhibit’, ‘X’ и ‘Y’.

Примечание: Основной текст также содержит различные цифры, такие как год (например, 1992) или количество (например, 50). Мне нужны только те, которым предшествует буква.

Большое спасибо, Гай

Комментарии:

1. можете ли вы предоставить какой-нибудь пример того, как выглядит вывод из pdfplumber?

2. Привет — я добавил это в основной пост. Спасибо

Ответ №1:

Попробуйте это таким образом:

 ap_lst = [your list above]
for item in ap_lst:
    if 'Exhibit' in ap_lst[ap_lst.index(item)-1]:
        print('Exhibit',item)
  

Вывод:

 Exhibit R40;
Exhibit C400.
Exhibit R9.
Exhibit P21
Exhibit CB12
Exhibit MM42.
  

Очевидно, что вы можете очистить выходные данные, удалив точки, точки с запятой и т.д.

Редактировать: объяснение третьей строки:

Для каждого элемента в списке найдите позицию в индексе этого элемента ( ap_lst.index(item) ). Теперь нам нужно проверить, какое слово находится в непосредственно предшествующем элементе списка — этот непосредственно предшествующий элемент будет иметь позицию индекса ниже на единицу ( index(item)-1] ), чем у текущего элемента. Затем, используя эту новую позицию индекса, выясните, какой элемент находится в этой позиции в списке ( ap_lst[ap_lst.index(item)-1] }. Если этот предыдущий элемент состоит из слова is Exhibit , вы знаете, что текущий элемент является целевым номером экспоната.

Комментарии:

1. Спасибо — это сработало отлично. Не могли бы вы объяснить, как работает 3-я строка?