我正在尝试解析包含多个块的文件。该文件如下所示。
$ Start of something1
.........contents
.........
$ End of something1
$ Start of something2
..........
..........
$ End of something2
some comments that should be included in block2.
$ Start of something3
.......
.......
$ End of something3
我已成功从第一行($ Start)解析到包含“$ End of .....”的块的最后一行。 但我遇到的问题基本上是我的样本中的第二块,它在结尾页脚后有一些注释。 我基本上需要在开始时找到$ Start并找到下一个$ Start但是在下一个“$ Start”之前grep所有内容。 非常感谢。
答案 0 :(得分:-1)
您可以使用不属于捕获组的正向前瞻:
t = """$ Start of something1
.........contents
.........
$ End of something1
$ Start of something2
..........
..........
$ End of something2
some comments that should be included in block2.
$ Start of something3
.......
.......
$ End of something3"""
import re
for k in re.findall(r'(\$ Start of .*?)(?=(?:\$ Start|\Z))',t,re.DOTALL|re.MULTILINE):
print "------ new find --------"
print k
print "------- end ------------\n\n"
输出:
------ new find --------
$ Start of something1
.........contents
.........
$ End of something1
------- end ------------
------ new find --------
$ Start of something2
..........
..........
$ End of something2
some comments that should be included in block2.
------- end ------------
------ new find --------
$ Start of something3
.......
.......
$ End of something3
------- end ------------
说明:
该模式捕获以文字$ Start of
开头的组,后跟尽可能少的字符(包括由于re.DOTALL引起的换行),以便匹配后跟$ Start
或{{1} } ==结束字符串。
(?= ..)是一个积极的前瞻,它的内容(?:\ $ Start | \ Z)不是它之前的组的一部分,它自己的组是non.capturing。
\Z
(\$ Start of .*?)
匹配字符$ literally(区分大小写)\$
字面匹配字符Start of
(区分大小写)Start of
匹配任何字符
.*?
量词 - 零和无限次之间的匹配,尽可能少,根据需要扩展(懒惰)*?
(?=(\$ Start|\Z))
(\$ Start|\Z)
\$ Start
匹配字符$ literally(区分大小写)\$
字面匹配字符Start
(区分大小写)Start
\Z
在字符串末尾断言位置,或者在字符串末尾的行终止符之前断言(如果有的话)全球模式标志
\Z
:多行。导致^和$匹配开头/结尾
每一行(不仅是字符串的开头/结尾)重新。
re.MULTILINE
:单行。 Dot匹配换行符
您可以在我根据您的文字制作正则表达式的https://regex101.com/r/h27O0d/1处查看说明。