Разделите документ Word по регулярному выражению, а затем сгруппируйте подобные заголовки в свои собственные объекты. - PullRequest
0 голосов
/ 05 марта 2019

У меня есть docx, который я прочитал в jupyter так:

### Import libraries
import docx2txt
import os
import re
import pandas
import docx

### Read document
file_text = docx2txt.process("big_document.docx")

В этом документе несколько страниц с одинаковыми заголовками. Я хочу найти эти заголовки, а затем сгруппировать все подобные заголовки в свои собственные объекты. В следующем фрагменте все первые тридцать страниц моего документа имеют одинаковый заголовок EXAMPLE ONE (он не в формате заголовка, только одна уникальная строка идентификации на каждой странице, которая соответствует другим 29 страницам):

### Loop to get appropriate sections, according to the re.findall()
for i in range(0, 30):
    match = re.findall('EXAMPLE\sONE', file_text)
    print(match[i])

re.findall() находит каждый экземпляр EXAMPLE ONE, но возвращает эти два слова только 30 раз. Если я добавлю re.split() и установлю соответствующий диапазон, он вернет весь документ (несколько сотен страниц).

### Loop to get appropriate sections, according to the re.split()
for i in range(0, 30):
    match = re.split('EXAMPLE\sONE', file_text)
    print(match[i])

# still returns whole document, instead of just the 30 pages with the chosen header

Как мне установить код, чтобы он возвращал только страницы с соответствующими заголовками и только эти страницы? Я думаю re.split() - это мой инструмент, но я не могу заставить его работать.

Документ имеет несколько заголовков, вплоть до EXAMPLE SEVEN, и я собирался сделать цикл for для каждого и return объект. Спасибо

Ответы [ 2 ]

1 голос
/ 05 марта 2019

Я не думаю, что вы сможете получить соответствующую страницу для данного заголовка, так как, если я не ошибаюсь, docx не вернет символ «конец страницы», который может позволить вам указатьконец содержимого, которое вы хотите.

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

match = re.search('^((.|\n)+)EXAMPLE\nTWO', file_text, flags=re.MULTILINE)
print(match.group(1))
0 голосов
/ 11 июля 2019
from docx2python import docx2python
from docx2python.iterators import iter_paragraphs
from collections import defaultdict
import re

text = docx2python('path_to_file.docx')
groups = defaultdict(list)
for par in iter_paragraphs(text.document):
    header = re.search('EXAMPLE\s[A-Z]+', par)
    if header:
        open_group = groups[header.group()]
    open_group.append(par)
...