用于在python中检索文本范围的Regex

2024-09-27 19:21:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着将一个规范的长文本分割开来,并提取出该规范的特定文本范围。我发现在python中使用re.split()是做这项工作的最佳方式(我认为)。所以这里有一个文本(西班牙语)的例子,我正在尝试split

test = "11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten 
la explosión por golpe, chispa o calentamiento. 12. Requisitos de seguridad e 
higiene para el transporte y almacenamiento de sustancias corrosivas, irritantes 
o tóxicas 12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe 
hacerse en recipientes específicos, de materiales compatibles con la sustancia de 
que se trate. 12.2 Cuando el transporte de sustancias corrosivas, irritantes o 
tóxicas en los centros de trabajo se realice a través de un sistema de tuberías o 
recipientes portátiles, éstos deben estar cerrados para evitar que su contenido se 
derrame o fugue."

所以我想要达到的是split文本和array的文章。['11.3.2 Debe llevarse ...','12. Requisitos ...','12.1 El almacenamiento ...','12.2 Cuando...']。你知道吗

所以目前我所做的没有成功的是:

re.split("\s(\d{1,2}\.\d*\.*\d*\s[A-Z]+)",test)

因此:

['11.3.2 Debe llevarse a cabo ...', '12. R', 'equisitos de seg ...', '12.1 E', 'l almacenamiento de sustancias corrosivas ... ', '12.2 C', 'uando el transporte de sustancias corrosivas ...', '13. V', 'igilancia La vigilancia del...']

有什么建议吗?你知道吗


Tags: 文本规范deelquesplitsetransporte
3条回答

我建议按标准的数目分开,然后按2乘2的顺序连接

x = re.split(r"(?:\A\s*|\.\s+)(\d+(?:(?:[.]\d+)+|[.]))", test_str)[1:]
list = [i+j for i,j in zip(x[::2], x[1::2])]
print(list)

参见演示here

您可以执行以下操作:

import re

test = """11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten 
la explosión por golpe, chispa o calentamiento. 12. Requisitos de seguridad e 
higiene para el transporte y almacenamiento de sustancias corrosivas, irritantes 
o tóxicas 12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe 
hacerse en recipientes específicos, de materiales compatibles con la sustancia de 
que se trate. 12.2 Cuando el transporte de sustancias corrosivas, irritantes o 
tóxicas en los centros de trabajo se realice a través de un sistema de tuberías o 
recipientes portátiles, éstos deben estar cerrados para evitar que su contenido se 
derrame o fugue."""

pattern = re.compile('\d{1,2}(\.\d{1,2})*([^\d]+)')


for match in pattern.finditer(test):
    print(match.group())
    print('     -')

输出

11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten 
la explosión por golpe, chispa o calentamiento. 
     -
12. Requisitos de seguridad e 
higiene para el transporte y almacenamiento de sustancias corrosivas, irritantes 
o tóxicas 
     -
12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe 
hacerse en recipientes específicos, de materiales compatibles con la sustancia de 
que se trate. 
     -
12.2 Cuando el transporte de sustancias corrosivas, irritantes o 
tóxicas en los centros de trabajo se realice a través de un sistema de tuberías o 
recipientes portátiles, éstos deben estar cerrados para evitar que su contenido se 
derrame o fugue.
     -

模式\d{1,2}(\.\d{1,2})*([^\d]+)将匹配头(编号),后跟不是数字的所有内容。作为一种替代方法,您可以使用以下内容,并进行展望:

pattern = re.compile('\d{1,2}(\.\d{1,2})*(.+?)(?=(\d{1,2}(\.\d{1,2})*|$))', re.DOTALL)


for match in pattern.finditer(test):
    print(match.group())
    print('     -')

输出

11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten 
la explosión por golpe, chispa o calentamiento. 
     -
12. Requisitos de seguridad e 
higiene para el transporte y almacenamiento de sustancias corrosivas, irritantes 
o tóxicas 
     -
12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe 
hacerse en recipientes específicos, de materiales compatibles con la sustancia de 
que se trate. 
     -
12.2 Cuando el transporte de sustancias corrosivas, irritantes o 
tóxicas en los centros de trabajo se realice a través de un sistema de tuberías o 
recipientes portátiles, éstos deben estar cerrados para evitar que su contenido se 
derrame o fugue.
     -

这样做的目的是匹配后跟标题或文本结尾的所有内容。注意标志re.DOTALL的使用。你知道吗

findall的另一个解决方案:

re.findall(r"(?s)(?:\d+\.\s|(?:\d+\.)+\d+\s)(?:(?!\d+\.).)+",txt)

Out: 
['11.3.2 Debe llevarse a cabo mediante equipos o sistemas de seguridad que eviten \nla explosión por golpe, chispa o calentamiento.',
 '12. Requisitos de seguridad e \nhigiene para el transporte y almacenamiento de sustancias corrosivas, irritantes \no tóxicas',
 '12.1 El almacenamiento de sustancias corrosivas, irritantes o tóxicas debe \nhacerse en recipientes específicos, de materiales compatibles con la sustancia de \nque se trate.',
 '12.2 Cuando el transporte de sustancias corrosivas, irritantes o \ntóxicas en los centros de trabajo se realice a través de un sistema de tuberías o \nrecipientes portátiles, éstos deben estar cerrados para evitar que su contenido se \nderrame o fugue.']

"""
(?s) '.' matches \n, too

(?:\d+\.\s|(?:\d+\.)+\d+\s)  the exact numbering pattern

(?:(?!\d+\.).)+  matches any character which not a start of a numbering

Edit:
(?:.(?!\d+\.))+  changed to (?:(?!\d+\.).)+
The previous pattern cuts the last char (in our case the space) before the numbering.
"""

相关问题 更多 >

    热门问题