Python для извлечения абзаца из текстового файла: разделенная строка с точным совпадением нескольких вложенных разделителей - PullRequest
0 голосов
/ 15 апреля 2019

Я читаю сотни PDF-файлов, чтобы извлечь реферат. Моя стратегия: (1) разделить после разделителя abstract (2) читать аннотацию (3) остановить, когда пустая строка. Вот код, который может сделать это:

import re    
raw = ' Some text\n\nABSTRACT\nExtract \nthis text\n\nOther text'
pattern = 'abstract'
abstract = re.split(pattern ,raw, flags=re.IGNORECASE)[1].split("\n\n")[0]
print(abstract)

Проблема заключается в том, что разные pdf-файлы могут содержать разные формы для моих разделителей, таких как abstract:, abstract:\n, abstract\n, которые все являются вложенными. Соответственно я попробовал что-то вроде этого:

    import re    
    raw = ' Some text\n\nAbstract:\n\nExtract \nthis text\n and include 
 abstraction and Abstraction \n\nOther text'
    pattern = 'abstract|abstract:|abstract:\n' 
    abstract = re.split(pattern, raw, flags=re.IGNORECASE)[1].split("\n\n")[0]
    print(abstract)

Тем не менее, это не сработало для приведенного выше примера. Кроме того, этот код не будет работать для точного соответствия. Например, он не будет игнорировать abstraction и Abstraction

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вы можете добавить как можно больше деталей к регулярному выражению, в этом случае мы можем добавить символы до и после abstract

>>> raw=' Some text\n\nABSTRACT:\t\nExtract this text\n adasdd\n\nSome other text'
>>> arr = re.split('(?i)\n{1,2}abstract[:\n\t]+',raw)[1].split('\n\n')
>>> arr
['Extract this text\n adasdd', 'Some other text']
>>> arr[0]
'Extract this text\n adasdd'

(?i) так же, как flags=re.IGNORECASE
\n{1,2} 1 или 2 символа новой строки
[:\n\t]+ этот список символов 1 или более раз.

1 голос
/ 15 апреля 2019

В шаблонах, которые вы хотите разделить, упорядочите их так, если один является подмножеством другого, он появится позже в списке

pattern = 'abstract:|abstract'

Не беспокойтесь о пробелах в конце (\n,\n\n, \n\t) при разбиении, позаботьтесь об этом позже, используя .strip(), так как это удалит все виды пробелов с концов строки.

text_after_abstract_header = re.split(pattern, raw, flags=re.IGNORECASE)[1]
abstract = text_after_abstract_header.strip().split('\n\n')
...