Python 使用正则表达式从PDF原始文本中提取子字符串

Python 使用正则表达式从PDF原始文本中提取子字符串,python,regex,text,regex-lookarounds,data-processing,Python,Regex,Text,Regex Lookarounds,Data Processing,我试图从pdf文档中提取包含罗马索引的小节 例如,这是文件的一部分 \n1.1\n\n范围\n\n本PTS规定了\n\n分类要求和建议,验证\n\n失效\nions。\n\n范围包括下列内容:\n\nii。\n\nSemi\n-\n相对SIL分类\n\nii。\n\n严重跳闸分析\n\niii。\n\n概率和体系结构SIL验证\n\niv。\n\n SIL间隙闭合建议\n\n 我想要的只是以下内容: 此PTS指定分类的\n \n要求和建议,验证\n\n失效\nions。\n\n范围包括下列内容:

我试图从pdf文档中提取包含罗马索引的小节

例如,这是文件的一部分

\n1.1\n\n范围\n\n本PTS规定了\n\n分类要求和建议,验证\n\n失效\nions。\n\n范围包括下列内容:\n\nii。\n\nSemi\n-\n相对SIL分类\n\nii。\n\n严重跳闸分析\n\niii。\n\n概率和体系结构SIL验证\n\niv。\n\n SIL间隙闭合建议\n\n

我想要的只是以下内容:

此PTS指定分类的\n \n要求和建议,验证\n\n失效\nions。\n\n范围包括下列内容:\n\nii。\n\nSemi\n-\n相对SIL分类\n\nii。\n\n严重跳闸分析\n\niii。\n\n概率和体系结构SIL验证\n\niv。\n\n SIL间隙闭合建议\n\n

我需要罗马索引之前的句子以及罗马索引中的内容

然而,也有如下情况

3.1.3.1.3.1.3.3.1.3.3.3.3.3.1.3.3.3.3.1.3.3.3.3.1.3.3.3\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n n\na)\n\n原因和影响矩阵(CEM)\n\nb)\n\n管道和仪表图(P&ID)或工艺和公用工程\n流量方案(PEF)\n\nc)\n\nHAZOP报告\n\nd)\n\nIPF可靠性数据\n\nii。\n\n其他参考文件\n\na)\n\n工艺流程图(PFD)或工艺流程图(PFS)\n\nb)\n\n设备布局图\n\nc)\n\n过程保护流程方案(PSF)\n\nd)\n\n控制说明\n\ne)\n\n门锁/ESD逻辑图\n\nf\n\n设备布局图\n\ng)\n\n维护和检查数据\n\nh\n\n设备历史数据\n\n\n\nT\nh\ne\n\nl\ni\ns\nT\n\n\na\nb\no\nv\n\nis\n\n\nn\no\nT\n\n\ne\nx\nx\nh\nu\n。任何\n\not\nh\ne\nr\n\ndo\nc\nu\nm\ne\nn\nt\n/\nd\nr\nw\ng\ns\n\nreq\nu\nr\ne\nd\n\nf\no\nr\n\nt\nh\nc\nm\np\nL\nIPF\n\n\nn\nn\nn\nn\nn\nn\nr\nn\nr\nn\nr\nn\nn\nr\nn\nh\nh\nh\nh\nh\nn\nn\nh\nn\nn\nn\nn\nn\nh\nn\nn\nn\nn\nn\nn\nn\nn\nn\nn\nn\nn\nn\nn

我已将pdf转换为原始文本,并设法提取文档的部分。

regx = re.compile( '\.\n \n.+?:\n \n',re.DOTALL)
find = str(txt)
indexhead.append((regx.findall(find)))
上面的代码只能提取标题,不能同时提取罗马索引

\n\n范围包括下列内容:\n\n


我正试图根据模式进行提取,但我认为一些条件规则可能会有所帮助。

如果我正确理解这个问题,我们只需要去掉罗马索引,得到整个段落,我们将从一个简单的表达式开始,例如:

.+[0-9]\.?.+?([A-Z][a-z].*)
然后,随着新案例的出现,我们将只使用逻辑OR并添加额外的规则

试验 正则表达式 如果不需要此表达式,可以在中对其进行修改/更改

正则表达式电路 可视化正则表达式:


经过一番探索,下面是最接近我期望实现的解决方案:

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\\n\\n\\nt\\neam\\n\\np\\ne\\nr\\nf\\no\\nrming\\n\\nt\\nh\\ne\\n\\nI\\np\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\NOS操作移位首领或以上但它也可以发生在字符串“代码> > Ne=广泛影响\\n,建议的M NEthod中以实现按需描述失败的后果”\NAS如下:\\N\Ni \n描述IPF的\n\\\\\n(或设计意图);n\\nii。\\n\\n描述IPF上需求的原因,即所谓的需求场景\\ni.e\\n.\\n\\n过程控制层故障\\ne.g。控制阀故障,\\n无\\n操作员错误,\\n进料损失
我想将
包括在其中一种情况中,您认为这有意义吗?我也不明白您为什么将\n转换为\\n?这是强制性的吗?如果我想保留为\n怎么办?谢谢@Emma,我已经改进和修改了正则表达式,并在这里发布了答案。我只提取了“:I.”之后的内容,因此我将继续即兴创作,这样我就可以在罗马教旨小节之前包含解释句。
regx = re.compile( ': \ni(?:(?!\n[A-Z]).).*?\.\n\d\.|:\ni(?:(?!\n[A-Z]).).*?\.\n\d\.',re.DOTALL)
find = str(cleanSectionContent2[req])