在 python 中使用多个正则表达式提取特定文本?

extract specific text using multiple regex in python?

我在 python 3 中使用正则表达式时遇到问题所以如果有人能帮助我我会很高兴。我有一个如下所示的文本文件:

Header A
text text
text text
Header B
text text
text text
Header C
text text
here is the end

我想做的是列出 header 之间的文本,但包括 header 本身。 我正在使用这个正则表达式:

 re.findall(r'(?=(Header.*?Header|Header.*?end))',data, re.DOTALL)

结果来了

['Header A\ntext text\n text text\n Header', 'Header B\ntext text\n text text\n Header', 'Header C\n text text here is the end']

问题是我得到了列表中每个项目末尾的下一个 header。如您所见,当我们找到下一个 header 时,每个 header 都会结束,但最后一个 header 不会以特定方式结束

有没有办法使用正则表达式获取每个 header 的列表(不是元组),包括它自己的文本作为子字符串?

Header [^\n]*[\s\S]*?(?=Header|$)

尝试 this.See 演示。

https://regex101.com/r/iS6jF6/21

import re
p = re.compile(r'Header [^\n]*[\s\S]*?(?=Header|$)')
test_str = "Header A\ntext text\ntext text\nHeader B\ntext text\ntext text\nHeader C\ntext text\nhere is the end"

re.findall(p, test_str)

怎么样:

re.findall(r'(?=(Header.*?)(?=Header|end))',data, re.DOTALL)

您实际上需要使用积极的先行断言。

>>> s = '''Header A
text text
text text
Header B
text text
text text
Header C
text text
here is the end'''
>>> re.findall(r'Header.*?(?=Header)|Header.*?end',s, re.DOTALL)
['Header A\ntext text\ntext text\n', 'Header B\ntext text\ntext text\n', 'Header C\ntext text\nhere is the end']

在正先行中包含 \n,以免在每个项目的最后得到 \n 个字符。

>>> re.findall(r'Header.*?(?=\nHeader)|Header.*?end',s, re.DOTALL)
['Header A\ntext text\ntext text', 'Header B\ntext text\ntext text', 'Header C\ntext text\nhere is the end']

根据字符串 Header.

之前存在的换行符拆分您的输入
>>> re.split(r'\n(?=Header\b)', s)
['Header A\ntext text\ntext text', 'Header B\ntext text\ntext text', 'Header C\ntext text\nhere is the end']