Я пытался извлечь подраздел с римской индексацией из документа PDF.
Например, это один раздел документа,
\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'
то, что я хочу, только ниже:
This 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
Мне нужно предложение перед римской индексацией, а также содержимое внутри римской индексации.
Тем не менее, есть также случаи, как показано ниже
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
Я преобразовал PDF в необработанный текст, и мне удалось извлечь часть документа. То
regx = re.compile( '\.\n \n.+?:\n \n',re.DOTALL)
find = str(txt)
indexhead.append((regx.findall(find)))
Приведенный выше код может извлекать только заголовок, но не индексацию латинскими буквами вместе.
.\n \nThe scope includes the following:\n \n
Я пытаюсь извлечь на основе шаблона, но я думаю, что могут помочь некоторые условные правила.
Если я правильно понимаю проблему, мы бы хотели просто убрать римские индексы и получить весь абзац, который мы бы начали с простого выражения, такого как:
.+[0-9]\.?.+?([A-Z][a-z].*)
затем, по мере появления новых случаев, мы просто использовали логические ИЛИ и добавляли дополнительные правила.
# 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.
Если это выражение не нужно, его можно модифицировать/изменить в regex101.com.
jex.im визуализирует регулярные выражения:
однако это также может произойти в середине строки, например \\nE = Extensive impact\\n \\nThe recommended m\\nethod to achieve the consequences of failure on demand description is \\nas follows:\\n \\ni.\\n \\nDescribe the \\npurpose\\n \\n(or design intent) of the IPF;\\n \\nii.\\n \\nDescribe the \\ncause(s)of the demand on the IPF, the so called demand scenarios \\ni.e\\n.\\n \\nprocess control layer failure \\ne.g. con\\ntrol valve failure, \\nO\\nperator error, loss of \\nfeed
Я думаю включить :
в одно из условий, как вы думаете, это имеет смысл?
также я не понимаю, почему вы конвертируете \n в \\n? это обязательно? что, если я хочу сохранить как \n?
Спасибо @Emma, я улучшил и изменил регулярное выражение и разместил ответ здесь. Мне удалось извлечь все, что было после ':i.' поэтому я продолжу импровизировать, чтобы включить поясняющее предложение перед подразделом roman idices.
После некоторого исследования ниже приведено решение, которое наиболее близко к тому, чего я хочу достичь:
regx = re.compile( ': \ni(?:(?!\n[A-Z]).).*?\.\n\d\.|:\ni(?:(?!\n[A-Z]).).*?\.\n\d\.',re.DOTALL)
find = str(cleanSectionContent2[req])
Он обнаруживает те случаи, которые начинаются с ':i.' и заканчиваться заголовком раздела '\n\d.', но он не может обнаружить все случаи, поэтому я буду обновлять здесь больше решений.
Да, это решение может решить указанные случаи, однако у меня есть другой случай, который отличается от этого, как показано ниже
\n3.1.4\\n \\nIPF\\n \\nc\\nla\\ns\\nsific\\na\\ntion\\n \\nte\\na\\nm\\n \\nThe\\n \\nt\\neam\\n \\np\\ne\\nr\\nf\\no\\nrming\\n \\nt\\nh\\ne\\n \\nI\\nP\\nF\\n \\nc\\nl\\na\\ns\\ns\\nif\\ni\\nc\\nat\\ni\\no\\nn\\n \\nshall\\n \\ncomprise the following\\n:\\n \\ni.\\n \\nP\\nrocess Technologists/ \\nProcess Engineer\\n \\nii.\\n \\nOperations shift leader or above