Regex для OCR Clean-up - PullRequest
       5

Regex для OCR Clean-up

0 голосов
/ 22 января 2020

Я оцифровал некоторые книги и надеюсь вычистить оглавление. Мой вывод выглядит примерно так:

Lorem ipsum dolor sit amet, consectetur 
adipiscing elit.
(January 1, 2008)
Neque porro quisquam est qui dolorem 
ipsum quia dolor
(June 30, 2007)361
Finibus Bonorum et Malorum
(July 3, 2008)398

Я хочу разделить отдельные статьи, используя \)\d*\n*, но как мне соответствовать этой строке?

Некоторые номера страниц отсутствуют, а некоторые заголовки, например Neque porro quisquam est qui dolorem ipsum quia dolor, напечатаны в несколько строк.

В идеале я хочу разделить их на что-то вроде Finibus Bonorum et Malorum (July 3, 2008)398, чтобы извлечь заголовок, дату и номер страницы.

Извините, что задаю такой элементарный вопрос! Заранее благодарим за помощь.

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Очистка текста - тяжелая работа. Предоставленные образцы могут быть объединены в один, например, с использованием регулярных выражений, например:

([\w ,]+)\n(?:([\w ,.]+)\n)?(\(\w+ \d+, \d+\)\d*)

Пример кода

import re
regex = r"([\w ,]+)\n(?:([\w ,.]+)\n)?(\(\w+ \d+, \d+\)\d*)"
subst = "$1$2 $3"
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

Демонстрационная версия

0 голосов
/ 22 января 2020

Вы можете использовать это регулярное выражение для извлечения различных частей:

(.*?)(?=\([^\)]*\)\d*(?:\n|$))\(([^)]*)\)(\d*)(?:\n|$)

У него есть 3 группы захвата:

  1. Весь текст до первого (, то есть сопровождаемый только одним ), необязательными цифрами и концом строки или строки (так будет работать с заголовками, которые содержат (;
  2. Текст между ( и );
  3. Любые цифры после ) и до новой строки или конца строки.

Пример использования:

import re

txt = '''Lorem ipsum dolor sit amet, consectetur 
adipiscing elit.
(January 1, 2008)
The 39
steps
(June 30, 2007)361
A title with
a (bracketed) word
(April 1, 2020)34
Finibus Bonorum et Malorum
(July 3, 2008)398'''
pattern = re.compile(r'(.*?)(?=\([^\)]*\)\d*(?:\n|$))\(([^)]*)\)(\d*)(?:\n|$)', re.S)
print(pattern.findall(txt))

Вывод:

[
 ('Lorem ipsum dolor sit amet, consectetur \nadipiscing elit.\n', 'January 1, 2008', ''),
 ('The 39\nsteps\n', 'June 30, 2007', '361'),
 ('A title with\na (bracketed) word\n', 'April 1, 2020', '34'),
 ('Finibus Bonorum et Malorum\n', 'July 3, 2008', '398')
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...