我在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']
问题是我在列表中的每个项目的末尾都得到了下一个标题。正如您所见,当我们找到下一个标题时,每个标题都会结束,但最后一个标题不会以特定方式结束
有没有办法获得每个标题的列表(不是元组),包括使用正则表达式作为子串的自己的文本?
答案 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']