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

时间:2015-03-12 15:04:54

标签: python regex extract

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

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))',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']

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

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

3 个答案:

答案 0 :(得分:1)

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

试试这个。看看演示。

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)

答案 1 :(得分:1)

怎么样:

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

答案 2 :(得分:1)

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

>>> 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']