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