正则表达式从文本文件中提取文本块吗?

时间:2019-09-29 14:47:47

标签: python regex text text-extraction

我需要使用正则表达式从Python的文本文件中提取标题及其下的文本块,但我发现这很困难。

我将此PDF转换为文本,因此现在看起来像这样:

img

到目前为止,我已经能够使用以下正则表达式获取所有数字标头(12.4.5.4、12.4.5.6、13、13.1、13.1.1、13.1.12):

import re

with open('data/single.txt', encoding='UTF-8') as file:

    for line in file:
        headings = re.findall(r'^\d+(?:\.\d+)*\.?', line)
        print(headings)`

我只是不知道如何获得这些标题的措词部分或它们下方的文本段落。

编辑-这是文本:

I.S。 EN 60601-1:2006&A1:2013&AC:2014&A12:2014

60601-1©IEC:2005 60601-1©IEC:2005

– 337 – – 169 –

12.4.5.4其他产生诊断或治疗辐射的ME设备 适用时,制造商应在风险管理过程中处理 与ME设备相关的风险,除了产生诊断或治疗性辐射外, 用于诊断X射线和放射疗法(请参阅12.4.5.2和12.4.5.3)。

通过检查“风险管理文件”来检查是否符合要求。

12.4.6诊断或治疗声压 适用时,制造商应在风险管理过程中处理 与诊断或治疗声压相关的风险。

通过检查“风险管理文件”来检查是否符合要求。

13 *危险情况和故障条件

13.1特定危险情况

  • 常规

13.1.1 当按4.7中所述并在13.2中列出应用单故障条件时,一个 在这段时间内,在13.1.2至13.1.4(含)范围内的危险情况均不会发生。 我的设备。

一次任何一个组件的故障可能导致危险的情况,这是 4.7中描述。

  • 排放物,外壳变形或超过最高温度

13.1.2 不会发生以下危险情况: –散发出危险的火焰,熔融金属,有毒或可燃物质

数量;

–外壳变形到破坏符合15.3.1的程度; –

当以下情况时,应用部件的温度超过表24中所示的允许值 如11.1.3所述进行测量; 不是适用部件但可能很可能是ME设备部件的温度 进行测量并调整为超过表23中的允许值 在11.1.3中描述;

–超过表22中确定的“其他组件和材料”的允许值 1.5乘以12,5°C。表26,表27和表31中列出了绕组的限值。 在所有其他情况下,表22的允许值适用。

应使用11.1.3中描述的方法测量温度。

在4.7、8.1 b),8.7.2和13.2.2中关于排放的单一故障条件 禁止将火焰,熔融金属或可燃物质应用于零件和组件 哪里: –结构或电源电路限制了单故障

中的功耗

条件小于15 W或能量耗散小于900J。

3 个答案:

答案 0 :(得分:2)

您可以使用模式并在其后跟该行的其余部分匹配一个空格。

然后重复匹配以下所有非以标题开头的行。

^\d+(?:\.\d+)* .*(?:\r?\n(?!\d+(?:\.\d+)* ).*)*
  • ^\d+(?:.\d+)* 您的模式以匹配标题和后跟空格
  • .*匹配除换行符0次以上以外的所有字符
  • (?:非捕获组
    • \r?\n换行符
    • (?!负向查找,断言直接在右边的不是
      • \d+(?:.\d+)* 标题模式
    • )提前关闭
    • .*匹配除换行符0次以上以外的所有字符
  • )*关闭非捕获组并重复0次以上以匹配所有行

Regex demo

答案 1 :(得分:1)

也许

^(\d+(?:\.\d+)*)\s+([\s\S]*?)(?=^\d+(?:\.\d+)*)|^(\d+(?:\.\d+)*)\s+([\s\S]*)

可能有点接近我猜到的那些想要的文本。


在这里,我们只是寻找以开头的行,

^(\d+(?:\.\d+)*)\s+

然后,我们只需使用

([\s\S]*?)

直到下一行,

(?=^\d+(?:\.\d+)*)

然后,取决于输入的外观,我们可能有也可能没有,仅剩最后一个元素,我们将使用最后一个元素进行收集:

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

,然后我们将其更改(使用|)到先前的表达式。

尽管此方法易于编写代码,但由于我们使用环顾四周方法,因此在性能方面相当慢,因此如果可能要考虑时间复杂性,the other answer here会更好。

Demo 1

测试

import re

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

I.S. EN 60601-1:2006&A1:2013&AC:2014&A12:2014

60601-1 © IEC:2005 
60601-1 © IEC:2005

– 337 – 
– 169 –

12.4.5.4  Other ME EQUIPMENT producing diagnostic or therapeutic radiation 
When  applicable,  the  MANUFACTURER  shall  address  in  the  RISK  MANAGEMENT PROCESS  the 
RISKS associated  with  ME EQUIPMENT  producing  diagnostic or therapeutic radiation  other  than 
for diagnostic X-rays and radiotherapy (see 12.4.5.2 and 12.4.5.3). 

Compliance is checked by inspection of the RISK MANAGEMENT FILE.

12.4.6  Diagnostic or therapeutic acoustic pressure 
When  applicable,  the  MANUFACTURER  shall  address  in  the  RISK  MANAGEMENT PROCESS  the 
RISKS associated with diagnostic or therapeutic acoustic pressure. 

Compliance is checked by inspection of the RISK MANAGEMENT FILE.

13  *  HAZARDOUS SITUATIONS and fault conditions

13.1  Specific HAZARDOUS SITUATIONS

*  General 

13.1.1 
When  applying  the  SINGLE  FAULT  CONDITIONS  as  described  in  4.7  and listed  in  13.2,  one  at  a 
time,  none  of  the  HAZARDOUS  SITUATIONS  in  13.1.2  to  13.1.4  (inclusive)  shall  occur  in  the 
ME EQUIPMENT.

The failure of any one component at a time, which could result in a  HAZARDOUS  SITUATION, is 
described in 4.7. 

*  Emissions, deformation of ENCLOSURE or exceeding maximum temperature 

13.1.2 
The following HAZARDOUS SITUATIONS shall not occur: 
–  emission  of  flames,  molten  metal,  poisonous  or  ignitable  substance  in  hazardous 

quantities; 

–  deformation of ENCLOSURES to such an extent that compliance with 15.3.1 is impaired; 
– 

temperatures  of  APPLIED  PARTS exceeding  the  allowed  values  identified  in  Table  24  when 
measured as described in 11.1.3; 
temperatures  of  ME EQUIPMENT  parts  that  are  not  APPLIED  PARTS but  are  likely  to  be 
touched,  exceeding  the  allowable  values  in  Table  23  when  measured  and  adjusted  as 
described in 11.1.3; 

– 

–  exceeding the allowable values for “other components and materials” identified in Table 22 
times 1,5 minus 12,5 °C. Limits for windings are found in Table 26, Table 27 and Table 31. 
In all other cases, the allowable values of Table 22 apply. 

Temperatures shall be measured using the method described in 11.1.3. 

The  SINGLE  FAULT  CONDITIONS  in  4.7,  8.1 b),  8.7.2  and  13.2.2,  with  regard  to  the  emission  of 
flames,  molten  metal  or  ignitable  substances,  shall  not  be  applied  to  parts  and  components 
where: 
–  The  construction  or  the  supply  circuit  limits  the  power  dissipation  in  SINGLE  FAULT 

CONDITION to less than 15 W or the energy dissipation to less than 900 J. 

"""

print(re.findall(regex, string, re.M))

输出

  

[('12.4.5.4','产生诊断或治疗作用的其他ME设备   辐射\ n如果适用,制造商应在   风险管理过程与我相关的\ n风险   产生诊断或治疗性辐射的设备,除   \ n用于诊断X射线和放射疗法(请参阅12.4.5.2和12.4.5.3)。   \ n \ n通过检查风险管理来检查合规性   FILE。\ n \ n',``,''),('12.4.6','诊断或治疗声学   \ n如果适用,制造商应在   风险管理过程\ n与诊断相关的风险   或治疗声压。 \ n \ n符合性由以下人员检查   检查风险管理文件。\ n \ n',``,''),('13','*   危险情况和故障条件\ n \ n','',''),('13 .1',   '特定的危险情况\ n \ n *常规\ n \ n','',''),   ('13 .1.1','当将单次故障条件应用于   4.7中描述并在13.2中列出,一次\ n,无   13.1.2至13.1.4(含)的危险情况   应该在\ nME设备中发生。\ n \ n任何一个失败   一次可能导致危险情况的组件是   \ n在4.7中描述。 \ n \ n *发射,外壳变形或   超过最高温度\ n \ n','',''),('','','13 .1.2','The   不会发生以下危险情况:\ n –发射   火焰,熔融金属,有毒或可燃物质   危险\ n \ n数量; \ n \ n –外壳变形到这样的程度   违反15.3.1的程度; \ n– \ n \ n温度   应用零件的数量超过了   如第11.1.3节所述测量时的表24; \ n温度   ME设备零件不是应用零件,但可能   \ n超过表23中允许的值   按照11.1.3中的描述进行测量和调整时; \ n \ n– \ n \ n–   超出“其他组件和材料”的允许值   在表22中确定\ n×1.5减去12.5°C。绕组极限   可在表26,表27和表31中找到。\ n在所有其他情况下,   表22的允许值适用。 \ n \ n温度应为   使用11.1.3中描述的方法进行测量。 \ n \ n单一故障   关于4.7、8.1 b),8.7.2和13.2.2的条件   \火焰,熔融金属或可燃物质的散发,   不得应用于零件\ n其中:\ n–   结构或电源电路限制了功率   单个故障\ n \ n条件下的耗散小于15 W或   能量消耗小于900J。\ n \ n')]

答案 2 :(得分:1)

由于他们提供了详细的答案和有用的解释,我最终将@ The-fourth-bird的代码和@Emma的代码的一部分合并到此正则表达式中,这似乎很好地满足了我的需求。

(^\d+(?:\.\d+)*\s+)((?![a-z])[\s\S].*(?:\r?\n))([\s\S]*?)(?=^\d+(?:\.\d+)*\s+(?![a-z]))

这里是REGEX DEMO

我想做的就是将(数字标题),(单词标题)和(文本正文)分成用逗号分隔的组,这使我可以使用自定义分隔符将它们分成Excel中的列< strong>),(和其他一些后期处理。

关于此新正则表达式的好处是,它跳过了仅作为引用的编号标题,而不是实际上如下所示的标题:

img