Python重新解析文件

时间:2018-04-29 16:34:01

标签: python regex python-2.7

我正在尝试解析包含多个块的文件。该文件如下所示。

$ 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所有内容。 非常感谢。

1 个答案:

答案 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处查看说明。