Извлечение подстроки из необработанного текста PDF с помощью регулярных выражений - PullRequest
1 голос
/ 31 мая 2019

Я пытался извлечь подраздел, имеющий римскую индексацию, из документа PDF.

Например, это один из разделов документа,

\ n1.1 \ n \ nSCOPE \ n \ nЭто PTS определяет \ n \ nrequirements \ nи рекомендации для классификации, проверки \ n \ nFunct \ nions. \ N \ nВ область действия входит следующее: \ n \ ni. \ n \ nSemi \ n- \ nколичественная классификация SIL \ n \ nii. \ n \ nБезопасный анализ поездок \ n \ niii. \ n \ nПробиалистическая и архитектурная проверка SIL \ n \ niv. \ n \ nРекомендации \ n \ nдля пробела SIL замкнутость "

я хочу только ниже:

В этом PTS указываются \ n \ nrequirements \ nи рекомендации по классификации, проверке \ n \ nFunct \ nions. \ N \ nВ область действия входит следующее: \ n \ ni. \ N \ nSemi \ n- \ n-количественная классификация SIL \ n \ nii. \ n \ nБезопасный анализ командировок \ n \ niii. \ n \ nПробиалистическая и архитектурная проверка SIL \ n \ niv. \ n \ nРекомендации \ n \ nДля закрытия пробела SIL

Мне нужно предложение перед римской индексацией, а также содержание внутри римской индексации.

Однако бывают случаи, подобные приведенным ниже

3.1.3 \ n \ nDo \ nc \ numentation \ n \ nrequired \ n \ nT \ nh \ ne \ n \ nl \ nat \ ne \ ns \ nt \ n \ nissue \ n \ nof \ n \ nt \ nh \ ne \ n \ nf \ no \ nllo \ nw \ ni \ nng \ n \ ndocume \ nn \ nts \ n \ nshall \ n \ nbe \ n \ nav \ na \ nilab \ nl \ ne \ n \ nto \ n \ nthe \ n \ nte \ na \ nm \ n \ np \ ne \ nrf \ no \ nrm \ ni \ nng \ n \ nt \ nh \ ne \ nc \ nl \ nass \ ni \ nf \ ni \ ncati \ no \ nn: \ n \ ni. \ n \ nОбязательный справочный документ \ n \ na) \ n \ n Матрицы причин и следствий (CEM) \ n \ nb) \ n \ n Диаграмма трубопроводов и приборов (P & ID) или Процесс и утилита инженерные \ nflow схемы (PEFS) \ n \ nc) \ n \ nОтчет HAZOP \ n \ nd) \ n \ n Данные о надежности IPF \ n \ nii. \ n \ nДругие справочные документы \ n \ na) \ n \ nПроцессная схема (PFD) или Process Fl \ now Scheme (PFS) \ n \ nb) \ n \ nПроектный макет чертежа \ n \ nc) \ n \ nПроцесс защиты схем потока (PSFS) \ n \ nd) \ n \ nОтзывы о контроле \ n \ ne) \ n \ nЗамены блокировки / ESD \ n \ nf) \ n \ n Схема компоновки оборудования \ n \ ng) \ n \ nДанные технического обслуживания и проверки \ n \ nh) \ n \ nДанные по истории завода \ n \ n \ nT \ nh \ ne \ n \ nl \ ni \ ns \ nt \ n \ na \ nb \ no \ nve \ n \ nis \ n \ nn \ no \ nt \ n \ ne \ nx \ nh \ na \ nu \ NSTI \ пу \ пе. Любой \ n \ not \ nh \ ne \ nr \ n \ ndo \ nc \ nu \ nm \ ne \ nn \ nt \ ns \ n / \ nd \ nr \ na \ nw \ nin \ ng \ ns \ n \ nreq \ nu \ nir \ ne \ nd \ n \ nf \ no \ nr \ n \ nt \ nhe \ nc \ nom \ np \ nletion \ n \ no \ nf \ n \ nIPF \ n \ ns \ nt \ nu \ nd \ ny \ n \ ns \ nh \ na \ nll \ n \ nbe \ n \ nf \ nu \ nr \ nn \ nished \ n \ nas \ n \ na \ nn \ nd \ n \ nw \ nhen \ n \ nre \ nq \ nui \ nr \ ne \ nd \ n. \ n \ n

Я преобразовал PDF в необработанный текст, и мне удалось извлечь часть документа.

regx = re.compile( '\.\n \n.+?:\n \n',re.DOTALL)
find = str(txt)
indexhead.append((regx.findall(find)))

Приведенный выше код может извлекать только заголовок, но не римскую индексацию вместе

. \ N \ nВ область действия входит следующее: \ n \ n

Я пытаюсь извлечь данные на основе шаблона, но думаю, что могут быть полезны некоторые условные правила.

Ответы [ 2 ]

1 голос
/ 03 июня 2019

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

regx = re.compile( ': \ni(?:(?!\n[A-Z]).).*?\.\n\d\.|:\ni(?:(?!\n[A-Z]).).*?\.\n\d\.',re.DOTALL)
find = str(cleanSectionContent2[req])

Оно обнаруживает те случаи, которые начинаются с ': i.'и заканчивается заголовком раздела '\ n \ d.', но он не может обнаружить все случаи, поэтому я буду обновлять здесь больше решений.

1 голос
/ 31 мая 2019

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

.+[0-9]\.?.+?([A-Z][a-z].*)

тогда, когда появляются новые случаи, мы просто используем логические ИЛИ и добавляем дополнительные правила.

Демо

Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r".+[0-9]\.?.+?([A-Z][a-z].*)"

test_str = ("\\n1.1\\n \\nSCOPE\\n \\nThis PTS specifies the\\n \\nrequirements \\nand recommendations for Classification, Verification \\n\\nFunct\\nions.\\n \\nThe scope includes the following:\\n \\ni.\\n \\nSemi\\n-\\nquantitative SIL classification\\n \\nii.\\n \\nSpurious trip analysis\\n \\niii.\\n \\nProbabilistic and architectural SIL verification\\n \\niv.\\n \\nRecommendations\\n \\nfor SIL gap closure'\n\n"
    "3.1.3\\n \\nDo\\nc\\numentation\\n \\nrequired\\n \\nT\\nh\\ne\\n \\nl\\nat\\ne\\ns\\nt\\n \\nissue\\n \\nof\\n \\nt\\nh\\ne\\n \\nf\\no\\nllo\\nw\\ni\\nng\\n \\ndocume\\nn\\nts\\n \\nshall\\n \\nbe\\n \\nav\\na\\nilab\\nl\\ne\\n \\nto\\n \\nthe\\n \\nte\\na\\nm\\n \\np\\ne\\nrf\\no\\nrm\\ni\\nng\\n \\nt\\nh\\ne \\nc\\nl\\nass\\ni\\nf\\ni\\ncati\\no\\nn:\\n \\ni.\\n \\nMandatory reference document\\n \\na)\\n \\nCause and effect matrices (CEM)\\n \\nb)\\n \\nPiping and Instrument Diagram (P&ID) or Process and utility engineering \\nflow schemes (PEFS)\\n \\nc)\\n \\nHAZOP report\\n \\nd)\\n \\nIPF reliability data\\n \\nii.\\n \\nOther reference document\\n \\na)\\n \\nProcess Flow Diagram (PFD) or Process Fl\\now Scheme (PFS)\\n \\nb)\\n \\nPlant layout drawing\\n \\nc)\\n \\nProcess safeguarding flow schemes (PSFS)\\n \\nd)\\n \\nControl narratives\\n \\ne)\\n \\nInterlocks/ ESD logic diagram\\n \\nf)\\n \\nEquipment layout diagram\\n \\ng)\\n \\nMaintenance and Inspection Data\\n \\nh)\\n \\nPlant historian data\\n \\n \\nT\\nh\\ne\\n \\nl\\ni\\ns\\nt\\n \\na\\nb\\no\\nve\\n \\nis\\n \\nn\\no\\nt\\n \\ne\\nx\\nh\\na\\nu\\nsti\\nv\\ne. Any\\n \\not\\nh\\ne\\nr\\n \\ndo\\nc\\nu\\nm\\ne\\nn\\nt\\ns\\n/ \\nd\\nr\\na\\nw\\nin\\ng\\ns\\n \\nreq\\nu\\nir\\ne\\nd\\n \\nf\\no\\nr\\n \\nt\\nhe \\nc\\nom\\np\\nletion\\n \\no\\nf the\\n \\nIPF\\n \\ns\\nt\\nu\\nd\\ny\\n \\ns\\nh\\na\\nll\\n \\nbe\\n \\nf\\nu\\nr\\nn\\nished\\n \\nas\\n \\na\\nn\\nd\\n \\nw\\nhen\\n \\nre\\nq\\nui\\nr\\ne\\nd\\n.\\n \\n")

subst = "\\1"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

RegEx

Если это выражение нежелательно, его можно изменить / изменить в regex101.com .

RegEx Circuit

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

enter image description here

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