首页 > 解决方案 > Python重新解析文件

问题描述

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

$ 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 .....”的块的最后一行。但是我遇到的问题基本上是针对我的示例中像 2nd 这样的块,它在结束页脚之后有一些注释。我基本上需要在开始时找到 $ Start 并找到下一个 $ Start 但在下一个“$ Start”之前找到所有内容。提前非常感谢。

标签: pythonregexpython-2.7

解决方案


您可以使用不属于捕获组的积极前瞻:

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\Z== 字符串结尾。

(?=..) 是一个正向前瞻,它的内容 (?:\$ Start|\Z) 不是它之前的组的一部分,并且它自己的组是非捕获的。

  • 第一捕获组(\$ Start of .*?)
    • \$匹配字符 $ 字面意思(区分大小写)
    • Start of从字面上匹配字符 Start of(区分大小写)
    • .*?匹配任何字符
      • *?量词 - 在零次和无限次之间匹配,尽可能少,根据需要扩展(惰性)
  • 积极前瞻(?=(\$ Start|\Z))
    • 断言下面的正则表达式匹配
    • 第二捕获组(\$ Start|\Z)
      • 第一种选择\$ Start
        • \$匹配字符 $ 字面意思(区分大小写)
        • Start从字面上匹配字符 Start(区分大小写)
      • 第二种选择\Z
        • \Z断言字符串末尾的位置,或字符串末尾的行终止符之前(如果有)

全局模式标志

  • re.MULTILINE: 多行。导致 ^ 和 $ 匹配每行的开始/结束(不仅是字符串的开始/结束)。

  • re.DOTALL: 单线。点匹配换行符

您可以在https://regex101.com/r/h27O0d/1查看解释,我根据您的文本开发了正则表达式。


推荐阅读