Как разбить текст pdf по номерам - PullRequest
1 голос
/ 11 июля 2019

Так что моя проблема не столько в извлечении PDF.Предполагая, что это выдержка из PDF-файла

(a) Это мой первый абзац, который представляет собой какой-то ненужный текст

(b) Это еще один абзац, но он случайно имеет некоторую ссылку на другой абзацкоторый ссылается на пункт 945 (d)

(c) Это опять третий абзац

Теперь я пытаюсь создать список с 3 значениями, каждое из которых представляет абзац.

import re
entire_text = """(a) This is my first paragraph, which is some junk text

(b) This is another paragraph, but it incidentally has some reference to another paragraph which refers to clause 945(d) somewhere within this text

(c) This again is is some third paragraph"""
PDF_SUB_SECTIONS = ["(a) ", "(b) ", "(c) ", "(d) ", "(e) ", "(f) ", "(g) "]
regexPattern = '|'.join(map(re.escape,PDF_SUB_SECTIONS))
glSubSections = re.split(regexPattern, entire_text)

То, что я ожидал, это [«Это мой первый абзац, который представляет собой какой-то ненужный текст», «Это другой абзац, но он, кстати, имеет некоторую ссылку на другой абзац, который ссылается на пункт 945 (d) где-то в этом тексте »,« Это опять какой-то третий абзац »]

То, что я получаю, это [« Это мой первый абзац, который представляет собой какой-то ненужный текст »,« Это другой абзац, ноон, кстати, имеет некоторую ссылку на другой абзац, который ссылается на пункт 945 ',' где-то в этом тексте ',' Это опять-таки третий абзац ']

Дополнительная информация: 1) пункт 945 (d) - Естьникогда не будет пробела между такими "945" (или любой текст) и "(d" 2) Я использую PyPDF2 для извлечения текста выше

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Есть несколько способов сделать это с помощью регулярных выражений, но обычно это будет сложнее, чем, вероятно, не лучшим способом. Например, с выражением, похожим на:

^(?:\([^)]+\))\s*(.*)

Тест с re.findall

import re

regex = r"^(?:\([^)]+\))\s*(.*)"

test_str = ("(a) This is my first paragraph, which is some junk text\n\n"
    "(b) This is another paragraph, but it incidentally has some reference to another paragraph which refers to clause 945(d)\n\n"
    "(c) This again is is some third paragraph")

print(re.findall(regex, test_str, re.MULTILINE))

выход

['This is my first paragraph, which is some junk text', 'This is another paragraph, but it incidentally has some reference to another paragraph which refers to clause 945(d)', 'This again is is some third paragraph']

Тест с re.sub

import re

regex = r"^(?:\([^)]+\))\s*(.*)"

test_str = ("(a) This is my first paragraph, which is some junk text\n\n"
    "(b) This is another paragraph, but it incidentally has some reference to another paragraph which refers to clause 945(d)\n\n"
    "(c) This again is is some third paragraph")

subst = "\\1"

print(re.sub(regex, subst, test_str, 0, re.MULTILINE))

Тест с re.finditer

import re

regex = r"^(?:\([^)]+\))\s*(.*)"

test_str = ("(a) This is my first paragraph, which is some junk text\n\n"
    "(b) This is another paragraph, but it incidentally has some reference to another paragraph which refers to clause 945(d)\n\n"
    "(c) This again is is some third paragraph")

matches = re.finditer(regex, test_str, re.MULTILINE)

for matchNum, match in enumerate(matches, start=1):

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1

        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

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

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

0 голосов
/ 11 июля 2019
pattern = r'^\([a-z]\)'
re.split(pattern, entire_text, flags=re.MULTILINE)

Это будет работать, но первым элементом результирующего списка будет пустая строка.Это немного проще, чем другое решение.Мы сопоставляем начало строки с ^, но для того, чтобы это работало в строке, которая занимает несколько строк, флаг re.MULTILINE должен быть передан re.split.Если вы хотите опустить этот плохой первый элемент, просто используйте срез в результирующем списке, например, re.split(pattern, entire_text, flags=re.MULTILINE)[1:].

Для получения дополнительной информации об этой вещи re.MULTILINE см. документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...